1
+ # -*- coding:utf-8 -*-
2
+ __author__ = 'bobo'
3
+
4
+ import subprocess ,os
5
+ import time
6
+ import re
7
+ import paramiko
8
+ import logging
9
+
10
+ time_now = time .strftime ('%Y-%m-%d' ,time .localtime (time .time ()))
11
+ #####################################################################################################################
12
+ #split to get your server's info for connection for your config file
13
+ def hp (server ):
14
+ servers = re .split (':' ,server )
15
+ server = servers [0 ]
16
+ try :
17
+ port = servers [1 ]
18
+ except :
19
+ port = '22'
20
+ try :
21
+ user = servers [2 ]
22
+ except :
23
+ user = 'root'
24
+ try :
25
+ passwd = servers [3 ]
26
+ except :
27
+ passwd = 0
28
+ return server ,port ,user ,passwd
29
+
30
+ #check dest dir , if not exist,it will create
31
+ def dir (base ,server ,time_now ):
32
+ path = '%s%s/%s' % (base ,server ,time_now )
33
+ if os .path .isdir (path ):
34
+ pass
35
+ else :
36
+ os .makedirs (path )
37
+ return path
38
+
39
+ #connect ssh
40
+ def ssh (server ,port ,cmd ):
41
+ try :
42
+ #set ssh-keygen to connect remote server
43
+ pkeyfile = '/root/.ssh/id_rsa'
44
+ key = paramiko .RSAKey .from_private_key_file (pkeyfile )
45
+ ssh = paramiko .SSHClient ()
46
+ ssh .set_missing_host_key_policy (paramiko .AutoAddPolicy )
47
+ ssh .connect (server ,port ,timeout = 5 ,pkey = key )
48
+ cmd_status = 1
49
+ stdin ,stdout ,stderr = ssh .exec_command (cmd )
50
+ print '%s: %scmd has sent sucessfuly\n ' % (server ,cmd )
51
+ err = stderr .readlines ()
52
+ for msg in err :
53
+ #tak out blanks and line break
54
+ msg = msg .strip ()
55
+ log (msg ,server )
56
+ cmd_status = 0
57
+ ssh .close ()
58
+ except BaseException ,e :
59
+ print '%s\t ssh login failed!! error:%s\n ' % (server ,e )
60
+ log (e ,server )
61
+ cmd_status = 0
62
+ return cmd_status
63
+ #write error log
64
+ def log (msg ,host = 0 ):
65
+ logging .basicConfig (level = logging .WARNING ,
66
+ format = '%(asctime)s %(filename)s[line %(lineno)d]: %(message)s' ,
67
+ datefmt = '%b %d %Y %H:%M:%S' ,
68
+ filename = '/home/backup/logs/backup_error.log' ,
69
+ filemode = 'a' )
70
+ message = '%s %s %s' % (msg ,'targethost:' ,host )
71
+ logging .error (message )
72
+
73
+ #####################################################################################################################
74
+ #get file from remote server cycles
75
+ def get_file (servers ,items ,base_path ):
76
+ for i in range (len (servers )):
77
+ servers_port = hp (servers [i ])
78
+ servers [i ] = servers_port [0 ]
79
+ port = servers_port [1 ]
80
+ for j in range (len (items )):
81
+ dir_dest = dir (base_path ,servers [i ],time_now )
82
+ back_files (servers [i ], items [j ],port ,dir_dest )
83
+ time .sleep (0.5 )
84
+
85
+ #function for get_file
86
+ def back_files (server ,item ,port ,dest ):
87
+ if item [- 2 :]== 'gz' :
88
+ print ".gz file ,it will be remove after geting "
89
+ cmd = '%s%s:%s %s %s' % ('/usr/bin/rsync -aucvvLzP --remove-source-files --progress root@' , server , item , dest ,'-e \' ssh -p ' + port + '\' ' )
90
+ else :
91
+ cmd = '%s%s:%s %s %s' % ('/usr/bin/rsync -aucvvLzP --progress root@' , server , item , dest ,'-e \' ssh -p ' + port + '\' ' )
92
+ try :
93
+ result = subprocess .Popen (cmd ,shell = True ,stderr = subprocess .PIPE )
94
+ stderr = result .stderr .readlines ()
95
+ for msg in stderr :
96
+ msg = msg .strip ()
97
+ log (msg ,server )
98
+ result .wait ()
99
+ except Exception ,e :
100
+ print '%s:%s' % ('backup failed' ,e )
101
+ log (e ,server )
102
+ #########################################################
103
+ #get sql from remote server cycles
104
+ def get_sql (servers ,items ,base_path ,user = 0 ,passwd = 0 ):
105
+ for i in range (len (servers )):
106
+ host = hp (servers [i ])
107
+ servers [i ] = host [0 ]
108
+ port = host [1 ]
109
+ user = host [2 ]
110
+ passwd = host [3 ]
111
+ #get server and database from dict
112
+ items1 = items [servers [i ]]
113
+ #get database from databases
114
+ item_server = re .split (':' ,items1 )
115
+ for j in range (len (item_server )):
116
+ dir_dest = dir (base_path ,servers [i ],time_now )
117
+ sql_sucess = backup_sqls (servers [i ],port ,item_server [j ],user ,passwd )
118
+ #not sucess to backup,it will skip this database
119
+ if sql_sucess == 0 :
120
+ print '%s:%s backup failed,system will skip it' % (servers [i ],item_server [j ])
121
+ continue
122
+ #get dir of remote server
123
+ sql_src = '%s%s' % (sql_path ,item_server [j ])
124
+ #get sql file from remote server
125
+ get_back_files (servers [i ], sql_src ,port ,dir_dest )
126
+ time .sleep (0.5 )
127
+ #exec remote sql cmd
128
+ #you must insure /usr/bin/mysqldump exists and it's avaliable
129
+ def backup_sqls (server ,port ,database ,user_sql ,passwd_sql = 0 ):
130
+ port = int (port )
131
+ #passwd_sql==0 if sql passwd is null
132
+ mysqldump = '/usr/bin/mysqldump -u'
133
+ global sql_path
134
+ sql_path = '/home/'
135
+ if passwd_sql == 0 :
136
+ cmd = '%s %s %s %s %s%s' % (mysqldump ,user_sql ,database ,'>' ,sql_path ,database )
137
+ else :
138
+ cmd = '%s %s %s%s %s %s %s%s' % (mysqldump ,user_sql , '-p' ,passwd_sql ,database ,'>' ,sql_path ,database )
139
+ sql_sucess = ssh (server ,port ,cmd )
140
+ return sql_sucess
141
+ #########################################################
142
+ ##get svn file from remote server cycles
143
+ def get_svn (servers ,items ,base_path ):
144
+ for server in servers :
145
+ host = hp (server )
146
+ server = host [0 ]
147
+ port = host [1 ]
148
+ #get file you want to backup from dict
149
+ items1 = items [server ]
150
+ items = re .split (':' ,items1 )
151
+ for item in items :
152
+ dir_dest = dir (base_path ,server ,time_now )
153
+ svn_sucess ,svn_path = backup_svn (server ,item ,port ,base_path )
154
+ #if not sucess to backup,system will skip it
155
+ if svn_sucess == 0 :
156
+ print '%s:%s backup failed,system will skip it' % (servers ,svn_path )
157
+ continue
158
+ #get svn dir from remote server
159
+ svn_src = '%s%s' % (svn_path ,'.svn' )
160
+ print svn_src
161
+ #get svn_file
162
+ get_back_files (servers ,svn_src ,port ,dir_dest )
163
+ time .sleep (0.5 )
164
+
165
+ #function to backup svn file
166
+ def backup_svn (server ,item ,port ,base_path ):
167
+ port = int (port )
168
+ #get son dir
169
+ p = re .compile (r'^/[A-Za-z0-9]*/' )
170
+ path = p .sub (r'' ,item )
171
+ svn_path = "%s%s" % (base_path ,path )
172
+ mkdir = "mkdir -p %s" % (svn_path )
173
+ ssh (server ,port ,mkdir )
174
+ #exec remote cmd to backup svn
175
+ cmd = "/usr/bin/svnadmin dump %s > %s.svn" % (item ,svn_path )
176
+ svn_sucess = ssh (server ,port ,cmd )
177
+ svn_sucess = 1
178
+ return svn_sucess ,svn_path
179
+ #########################################################
180
+ #####################################################################################################################
0 commit comments