autumnrd

Backup and archiving. Sftp and dump.

Oct 27th, 2014
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.41 KB | None | 0 0
  1. #!/usr/local/bin/python2.7
  2.  
  3. import os
  4. import sys
  5. import subprocess
  6. import ConfigParser
  7. import datetime
  8. import logging
  9. import tarfile
  10. import paramiko
  11.  
  12. #-------var-------
  13. config_path = "backup.cfg"
  14.  
  15. #-------backup options var-------
  16. src_path = ''
  17. dst_file = ''
  18. transfer_type = ''
  19. dst_path = ''
  20. dst_file_postfix = ''
  21. sftp_host = ''
  22. sftp_port = ''
  23. sftp_user = ''
  24. sftp_pass = ''
  25. sftp_path = ''
  26. db_name = ''
  27. db_user = ''
  28. db_pass = ''
  29. mysqldump_path = ''
  30. #--------------
  31.  
  32. def check_options(param_list, section, type_backup):
  33.  
  34. #-------f global var-------
  35.     global src_path
  36.     global dst_file
  37.     global transfer_type
  38.     global dst_path    
  39.     global dst_file_postfix
  40.     global sftp_host
  41.     global sftp_port
  42.     global sftp_user
  43.     global sftp_pass
  44.     global sftp_path
  45.     global db_name
  46.     global db_user
  47.     global db_pass
  48.     global mysqldump_path
  49.  
  50. #-------f var-------
  51.     job_status = "accept"
  52.     check = 0
  53.  
  54. #-------critical parametr's check-------
  55.     if type_backup == "file":
  56.         try:
  57.             src_path = backup_cfg.get(section, 'src_path')
  58.             if os.path.exists(src_path) == 0:
  59.                 job_status = "reject"
  60.                 logging.critical('[' + section + '] [src_path] : ' + src_path + ' not found')
  61.  
  62.             dst_file = backup_cfg.get(section, 'dst_file')
  63.             if dst_file == "" :
  64.                 job_status = "reject"
  65.                 logging.critical('[' + section + '] [dst_file] check backup file name')
  66.  
  67.         except:
  68.             logging.error(sys.exc_info()[1])
  69.             job_status = "reject"
  70.  
  71. #-------secondary parametr's check-------
  72.     try:
  73.         transfer_type = backup_cfg.get(section, 'transfer_type')
  74.         if transfer_type != 'fs' and transfer_type != 'sftp':
  75.             logging.info('[' + section + '] [transfer_type] wrong value, set to default : fs')
  76.             transfer_type = 'fs'
  77.     except:
  78.         err = ' '.join(sys.exc_info()[1])
  79.         if (err.find('transfer_type') >= 0):
  80.             logging.info(sys.exc_info()[1])
  81.             logging.info('[' + section + '] [transfer_type] set to default value : fs')
  82.             transfer_type = 'fs'
  83.  
  84.     try:
  85.         dst_path = backup_cfg.get(section, 'dst_path')
  86.         if os.path.exists(dst_path) == 0 and type_backup <> "mysql":
  87.             logging.info('[' + section + '] [dst_path] path not found, set to [src_path] : [' + src_path + ']')
  88.             dst_path = src_path
  89.         elif os.path.exists(dst_path) == 0 and type_backup == "mysql":
  90.             logging.info('[' + section + '] [dst_path] path not found, set to default : /tmp')
  91.             dst_path = "/tmp/"
  92.     except:
  93.         err = ' '.join(sys.exc_info()[1])
  94.         logging.info(sys.exc_info()[1])
  95.         if (err.find('dst_path') >= 0) and type_backup <> "mysql":
  96.             logging.info('[' + section + '] [dst_path] set to [src_path] : [' + src_path + ']')
  97.             dst_path = src_path
  98.         elif (err.find('dst_path') >= 0) and type_backup == "mysql":      
  99.             logging.info('[' + section + '] [dst_path] set to /tmp')
  100.             dst_path = "/tmp/"
  101.  
  102.     try:
  103.         get_postfix = backup_cfg.get(section, 'dst_file_postfix')
  104.         if get_postfix == 'timestamp':
  105.             dst_file_postfix = "_" + datetime.datetime.now().strftime("%d-%m-%Y_%H.%M.%S")
  106.         elif get_postfix =='none':
  107.             dst_file_postfix = ''
  108.         else:
  109.             dst_file_postfix = ''
  110.             logging.info('[' + section + '] [dst_file_postfix] wrong value, set to default : none')
  111.  
  112.     except:
  113.         err = ' '.join(sys.exc_info()[1])
  114.         if (err.find('dst_file_postfix') >= 0):
  115.             logging.info(sys.exc_info()[1])
  116.             logging.info('[' + section + '] [dst_file_postfix] set to default value : none')
  117.             dst_file_postfix = ''
  118.  
  119. #-------sftp parametr's check-------
  120.     if transfer_type == "sftp":
  121.         try:
  122.             sftp_port = backup_cfg.get(section, 'sftp_port')
  123.             if sftp_port == "":
  124.                 logging.info('[' + section + '] [sftp_port] wrong value, set to default : 22')
  125.                 job_status = "accept"
  126.  
  127.             sftp_host = backup_cfg.get(section, 'sftp_host')
  128.             if sftp_host == "":
  129.                 logging.critical('[' + section + '] [sftp_host] wrong value')
  130.                 job_status = "reject"
  131.  
  132.             sftp_user = backup_cfg.get(section, 'sftp_user')
  133.             if sftp_user == "":
  134.                 logging.critical('[' + section + '] [sftp_user] wrong value')
  135.                 job_status = "reject"
  136.  
  137.             sftp_pass = backup_cfg.get(section, 'sftp_pass')
  138.             if sftp_pass == "":
  139.                 logging.critical('[' + section + '] [sftp_pass] wrong value')
  140.                 job_status = "reject"
  141.  
  142.             sftp_path = backup_cfg.get(section, 'sftp_path')
  143.             if sftp_path == "":
  144.                 logging.critical('[' + section + '] [sftp_path] wrong value')
  145.                 job_status = "reject"
  146.  
  147.         except:
  148.             logging.critical(sys.exc_info()[1])
  149.             job_status = "reject"
  150.  
  151. #-------mysql parametr check-------
  152.     if type_backup == "mysql":
  153.         try:
  154.             db_name = backup_cfg.get(section, 'db_name')
  155.             if db_name == "":
  156.                 logging.critical('[' + section + '] [db_name] wrong value')
  157.                 job_status = "reject"
  158.  
  159.             db_user = backup_cfg.get(section, 'db_user')
  160.             if db_user == "":
  161.                 logging.critical('[' + section + '] [db_user] wrong value')
  162.                 job_status = "reject"
  163.  
  164.             db_pass = backup_cfg.get(section, 'db_pass')
  165.             if db_pass == "":
  166.                 logging.critical('[' + section + '] [db_pass] wrong value')
  167.                 job_status = "reject"
  168.  
  169.             mysqldump_path = backup_cfg.get('common', 'mysqldump_path')
  170.             if os.path.exists(mysqldump_path) == 0:
  171.                 logging.critical('sections [common] [mysqldump_path] verify the path to mysqldump')
  172.                 job_status = "reject"
  173.  
  174.         except:
  175.             logging.critical(sys.exc_info()[1])
  176.             job_status = "reject"
  177.  
  178.     return job_status
  179.  
  180. def backup(param_list, section, type_backup):
  181.  
  182. #-------f global var-------
  183.     global src_path
  184.     global dst_file
  185.     global transfer_type
  186.     global dst_path
  187.     global dst_file_postfix
  188.     global sftp_host
  189.     global sftp_port
  190.     global sftp_user
  191.     global sftp_pass
  192.     global sftp_path
  193.     global db_name
  194.     global db_user
  195.     global db_pass
  196.     global mysqldump_path
  197. #--------------
  198.     ret_base = check_options(param_list, section, type_backup)
  199.     if ret_base == "accept" :
  200.         backup_result = 0
  201.         logging.info('job [' + section + '] accepted')
  202.  
  203.         if type_backup == "mysql":
  204.             try:
  205.                 dst_file = db_name + "_db"
  206.                 src_path = dst_path + db_name + ".sql"
  207.                 dump_db = subprocess.Popen(mysqldump_path + " -u" + db_user + " -p" + db_pass + " " + db_name + " >" + src_path, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  208.                 ret_dump = dump_db.wait()
  209.                 if ret_dump == 0:
  210.                     backup_result = 0
  211.                     logging.info('--> job [' + section + '] mysql base [' + db_name + '] dumped')
  212.                 else:
  213.                     backup_result = 1
  214.                     for out in dump_db.stdout.readlines():
  215.                         logging.error("----> " + out.strip())
  216.                     logging.warning('job [' + section + '] aborted')
  217.                
  218.             except:
  219.                 backup_result = 1
  220.                 logging.error(sys.exc_info()[1])
  221.  
  222.         if backup_result == 0:
  223.             try:
  224.                 arc_path = dst_path + dst_file + dst_file_postfix + ".tar.gz"
  225.                 backup_arc = tarfile.open(arc_path, "w:gz")
  226.                 backup_arc.add(src_path)
  227.                 size = 0
  228.                 count = 0
  229.                 for tarinfo in backup_arc:
  230.                     size = size + tarinfo.size
  231.                     count = count + 1
  232.                 backup_arc.close()
  233.                 if type_backup == "mysql":
  234.                     os.remove(src_path)
  235.                 logging.info('--> job [' + section + '] archiving of files completed')
  236.                 logging.info('----> files archived : ' + str(count))
  237.                 logging.info('----> bytes archived : ' + str(size))
  238.                 logging.info('----> path to the archive : ' + arc_path)
  239.  
  240. #-------sftp transfer if enable-------
  241.                 if transfer_type == "sftp":
  242.                     try:
  243.                         transfer_cnt = datetime.datetime.now()
  244.                         transport = paramiko.Transport((sftp_host, int(sftp_port)))
  245.                         transport.connect(username = sftp_user, password = sftp_pass)
  246.                         sftp = paramiko.SFTPClient.from_transport(transport)
  247.                         local_file = arc_path
  248.                         remote_path = sftp_path + dst_file + dst_file_postfix + ".tar.gz"
  249.                         sftp_res = sftp.put(local_file, remote_path)
  250.                         sftp.close()
  251.                         transport.close()                
  252.                         transfer_cnt = datetime.datetime.now() - transfer_cnt
  253.                         logging.info('--> job [' + section + '] sftp file transfer finished')
  254.                         logging.info('----> bytes transfer : ' + str(sftp_res.st_size))
  255.                         logging.info('----> duration of the file transfer : ' + str(transfer_cnt.seconds) + ' seconds')
  256.                     except:
  257.                         logging.error(sys.exc_info()[1])
  258.             except:
  259.                 logging.error(sys.exc_info()[1])
  260.  
  261.     elif ret_base == "reject" :
  262.         logging.warning('job [' + section + '] reject')
  263.  
  264. #-------check command line options-------
  265. if len(sys.argv) > 2 and sys.argv[1] == '-f':
  266.     if os.path.exists(sys.argv[2]) == 0:
  267.         print 'config not found'
  268.     else:
  269.         config_path = sys.argv[2]
  270.  
  271. #-------load config-------
  272. backup_cfg = ConfigParser.RawConfigParser()
  273. ret = backup_cfg.read(config_path)
  274. sections_lst = backup_cfg.sections()
  275.  
  276. #-------check common options-------
  277. try:
  278.     log_name = backup_cfg.get('common', 'log_name')
  279.     if log_name == "":
  280.         log_name = "backup.log"
  281. except:
  282.     log_name = "backup.log"
  283.  
  284. try:
  285.     log_path = backup_cfg.get('common', 'log_path')
  286.     if os.path.exists(log_path) == 0:
  287.         log_path = ""
  288. except:
  289.     log_path = ""    
  290.  
  291. logging.basicConfig(filename = log_path + log_name ,format='[%(asctime)s] %(levelname)s : %(message)s', datefmt='%d %B %Y %H:%M:%S', level=logging.INFO)
  292. logging.info('<----------SCRIPT IS RUNNING------->')
  293.  
  294. #-------general-------
  295. for section_name in sections_lst:
  296.     if section_name <> "common":
  297.         try:
  298.             logging.info('start checking configuration for job [' + section_name + ']')    
  299.             type_backup = backup_cfg.get(section_name, 'type')
  300.             value_list = backup_cfg.items(section_name)
  301.             if type_backup == "file" or type_backup == "mysql":
  302.                 backup(value_list, section_name, type_backup)
  303.             else:
  304.                 logging.critical('[' + section_name + '] [type] wrong value')
  305.                 logging.warning('job [' + section_name + '] reject')
  306.         except:
  307.             logging.error(sys.exc_info()[1])
  308.             logging.warning('job [' + section_name + '] reject')
  309. logging.info(' ')
Add Comment
Please, Sign In to add comment