Skip to content

Commit a1ab2ec

Browse files
committed
commit
1 parent efd5265 commit a1ab2ec

File tree

5 files changed

+297
-0
lines changed

5 files changed

+297
-0
lines changed

123

Whitespace-only changes.

del_files.py

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# -*- coding: UTF-8 -*-
2+
__author__ = 'bobo'
3+
4+
'''
5+
note:the scripts will delete dir which like "path/IP/2017-xx-xx",for example:/home/backup/10.1.1.148/2017-09-19
6+
class:
7+
host_path:match path/ip from path which has set
8+
check_dir:check son dir and judge whether matching your rules
9+
del_dir:del dir
10+
11+
use:
12+
1.set path your environment
13+
2.set time for normal files and log file to del
14+
3.set host list
15+
'''
16+
import os
17+
import re
18+
import shutil
19+
from datetime import datetime
20+
21+
22+
time_now = datetime.now()
23+
path = '/home/backup'
24+
#set time for delete
25+
common_day = 30
26+
log_day = 180
27+
log_host = ['10.1.1.145','10.1.1.155']
28+
29+
class clean:
30+
def __init__(self,base_path):
31+
self.base_path = base_path
32+
33+
def host_path(self):
34+
host_path = list(os.listdir(self.base_path))
35+
for i in range(len(host_path)):
36+
#re to match path:base_path/IP
37+
host_rep = re.compile(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])')
38+
if host_rep.match(host_path[i]):
39+
host_dir = host_path[i]
40+
self.check_dir(host_dir)
41+
42+
def check_dir(self,dir):
43+
host_dir = os.path.join(self.base_path,dir)
44+
back_dir = os.listdir(host_dir)
45+
for i in range(len(back_dir)):
46+
back_time = datetime.strptime(back_dir[i],"%Y-%m-%d")
47+
day_value = time_now - back_time
48+
day_sub = day_value.days
49+
if dir in log_host:
50+
if day_sub > log_day:
51+
del_dir = os.path.join(host_dir,back_dir[i])
52+
self.del_dir(del_dir)
53+
else:
54+
print "dir %s/%s backup at %s,it's under %s天,system will skip it" %(host_dir,back_dir[i],back_time,log_day)
55+
else:
56+
if day_sub > common_day:
57+
del_dir = os.path.join(host_dir,back_dir[i])
58+
self.del_dir(del_dir)
59+
else:
60+
print "dir %s/%s backup at %s,it's under %s天,system will skip it" %(host_dir,back_dir[i],back_time,common_day)
61+
def del_dir(self,dir):
62+
shutil.rmtree(dir)
63+
clean(path).host_path()

functions.py

+180
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
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\tssh 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+
#####################################################################################################################

hosts.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# -*- coding:utf-8 -*-
2+
__author__ = 'bobo'
3+
4+
#the file is config file
5+
6+
7+
#base_path in your dest server
8+
base_path = '/home/backup/'
9+
10+
#it can be null if your server's ssh port is 22
11+
#################################################################################################################
12+
#nginx
13+
nginx_servers = ['10.1.1.184:9022','10.1.1.185:9022']
14+
nginx_items = ['/etc/nginx/conf.d','/etc/nginx/nginx.conf','/home/config','/var/log/nginx/*.gz']
15+
16+
#jenkins
17+
jenkins_servers = ['172.16.20.18']
18+
jenkins_items = ['/home/jenkins']
19+
20+
#phpredis
21+
phpredis_servers = ['172.16.20.49']
22+
phpredis_items = ['/etc/nginx/nginx.conf','/etc/nginx/nginx.d','/var/www']
23+
24+
#keepalived
25+
keepalived_servers = ['10.1.1.186:9022','10.1.1.176:9022']
26+
keepalived_items = ['/etc/keepalived/keepalived.conf']
27+
28+
#nexus
29+
nexus_servers = ['10.1.1.40:22']
30+
nexus_items = ['/home/nexus-2.14.0-01','/home/sonatype-work']
31+
32+
#################################################################################################################
33+
###sqlinfo,sql_databases must be dict
34+
#sql_servers = ['host:ssh_port:mysql_user:mysql_passwd']
35+
#sql_databases = {'host':'database1:database2:databasen'}
36+
37+
sql_servers = ['192.168.110.4:22:root','192.168.110.5:22:root:123456']
38+
sql_databases = {'192.168.110.4':'zentao:test1:test2','192.168.110.5':'mysql:test1:test2'}
39+
#################################################################################################################
40+
#svn,items must be dict
41+
svn_servers = ['10.1.1.231']
42+
svn_items = {'10.1.1.231':'/home/Repositories/abcd;/home/Repositories/main:/home/Repositories/manager'}
43+
#################################################################################################################

main.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# -*- coding:utf-8 -*-
2+
__author__ = 'bobo'
3+
4+
from functions import *
5+
from hosts import *
6+
7+
8+
if __name__ == '__main__':
9+
get_sql(sql_servers,sql_databases,base_path)
10+
get_svn(svn_servers,svn_items,base_path)
11+

0 commit comments

Comments
 (0)