Advertisement
anjarwebid

jrBackup v1

Feb 3rd, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.86 KB | None | 0 0
  1. """
  2. Name : jrBackup v1
  3.  
  4. Author : Anjar Fiandrianto / @anjarwebid
  5.  
  6. Version : 1.0
  7.  
  8. Date : 14-4-2012
  9.  
  10. Description: Simple mysql automatic database backup, implementing python daemon with double-fork magic
  11. from Stevens in "Advanced Programming in the UNIX Environment"
  12. """
  13.  
  14. import sys, os, time, ConfigParser
  15.  
  16. #global variable here
  17. folder = ""
  18. server = ""
  19. usr = ""
  20. passwd = ""
  21. interval = ""
  22.  
  23. def main():
  24.     #run as daemon
  25.     while 1:
  26.         backup()
  27.         time.sleep(interval*60)
  28.  
  29. def chkcfg():
  30.     global folder
  31.     global server
  32.     global usr
  33.     global passwd
  34.     global interval
  35.     if not os.path.isfile("jrBackupConfig.cfg"):
  36.         #create config file
  37.         writecfg = ConfigParser.RawConfigParser()
  38.         folder = raw_input("Enter your folder address (without ""/"" or slash on the end):")
  39.         server = raw_input("Server :")
  40.         usr = raw_input("MySQL User :")
  41.         passwd = raw_input("MySQL Password :")
  42.         interval = float(raw_input("Interval to backup database (in minutes) :"))
  43.         writecfg.add_section('basic')
  44.         writecfg.set('basic','folder', folder)
  45.         writecfg.set('basic','server', server)
  46.         writecfg.set('basic','user', usr)
  47.         writecfg.set('basic','password', passwd)
  48.         writecfg.set('basic','interval', interval)
  49.         with open('jrBackupConfig.cfg', 'wb') as configfile:
  50.             writecfg.write(configfile)
  51.         startApp()
  52.     else:
  53.         #if config file exist, just read config file
  54.         readcfg = ConfigParser.ConfigParser()
  55.         readcfg.read('jrBackupConfig.cfg')
  56.         folder = readcfg.get('basic', 'folder')
  57.         server = readcfg.get('basic', 'server')
  58.         usr = readcfg.get('basic', 'user')
  59.         passwd = readcfg.get('basic', 'password')
  60.         interval = readcfg.getfloat('basic','interval')
  61.         startApp()
  62.        
  63. def startApp():
  64.     # do the UNIX double-fork magic, see Stevens' "Advanced
  65.     # Programming in the UNIX Environment" for details (ISBN 0201563177)
  66.     try:
  67.         pid = os.fork()
  68.         if pid > 0:
  69.             # exit first parent
  70.             sys.exit(0)
  71.     except OSError, e:
  72.         print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
  73.         sys.exit(1)
  74.  
  75.     # decouple from parent environment
  76.     os.chdir("/")
  77.     os.setsid()
  78.     os.umask(0)
  79.  
  80.     # do second fork
  81.     try:
  82.         pid = os.fork()
  83.         if pid > 0:
  84.             # exit from second parent, print eventual PID before
  85.             print "Daemon PID %d" % pid
  86.             sys.exit(0)
  87.     except OSError, e:
  88.         print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
  89.         sys.exit(1)
  90.     # start the daemon main loop
  91.     main()
  92.  
  93. def backup():
  94.     #check and create log
  95.     f = open("/var/log/jrBackup", "w")
  96.     filestamplog = time.strftime('%Y-%m-%d %H:%M')
  97.     f.write ("backup on "+filestamplog+"\n")
  98.     # get database list
  99.     filestamp = time.strftime('%Y-%m-%d')
  100.     database_list_command="mysql -u %s -p%s -h %s --silent -N -e 'show databases'" % (usr, passwd, server)
  101.     #split database list
  102.     for database in os.popen(database_list_command).readlines():
  103.         database = database.strip()
  104.         #skip "information_scema" database backup
  105.         if database == 'information_schema':
  106.             continue
  107.         #set folder for database backup files
  108.         newpath = "%s/%s" % (folder,filestamp)
  109.         if not os.path.exists(newpath):
  110.             os.makedirs(newpath)
  111.         filename = "%s/%s-%s.sql" % (newpath, database, filestamp)
  112.         #generate backup file
  113.         os.popen("mysqldump -u %s -p%s -h %s -e --opt -c %s | gzip -c > %s.gz" % (usr, passwd, server, database, filename))
  114.         f.write ("Backup database "+database+" finished\n")
  115.     f.write ("All finished\n")
  116.     f.flush
  117.     f.close
  118.        
  119. if __name__ == "__main__":
  120.     chkcfg()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement