Advertisement
Guest User

Untitled

a guest
Oct 24th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.28 KB | None | 0 0
  1. #!/usr/bin/env python
  2. __author__ = 'Daniel'
  3.  
  4. import MySQLdb
  5. import argparse
  6. import datetime
  7. import re
  8. import sys
  9.  
  10.  
  11. class cBackup():
  12. def __init__(self):
  13. self.name = ''
  14. self.type = ''
  15. self.date = ''
  16. self.size = ''
  17. self.files = ''
  18. self.errors = ''
  19.  
  20.  
  21. def parseArgs():
  22. parser = argparse.ArgumentParser()
  23.  
  24. parser.add_argument('-H', '--host', default='127.0.0.1', metavar='DB host')
  25. parser.add_argument('-P', '--port', default=3306, type=int, metavar='DB port')
  26. parser.add_argument('-U', '--user', default='root', metavar='DB user')
  27. parser.add_argument('-p', '--pasw', default='', metavar="DB user's password")
  28. parser.add_argument('-b', '--base', default='bacula', metavar='database')
  29. parser.add_argument('--backup', default='None', metavar="pattern for finding backup's name, default ALL")
  30. parser.add_argument('--period', default='None', metavar='time period for finding backup, default ALL')
  31. parser.add_argument('-c', '--crit', default=0, type=int, metavar='Critical threshold')
  32. parser.add_argument('-w', '--warn', default=1, type=int, metavar='Warning threshold')
  33. parser.add_argument('client', metavar='Client Name')
  34.  
  35. namespace = parser.parse_args()
  36. return namespace
  37.  
  38.  
  39. def getData(namespace):
  40. try:
  41. db = MySQLdb.connect(host = namespace.host,\
  42. port = namespace.port,\
  43. user = namespace.user,\
  44. passwd = namespace.pasw,\
  45. db = namespace.base,\
  46. charset = 'utf8')
  47.  
  48. except MySQLdb.OperationalError as error:
  49. raise RuntimeError(error)
  50.  
  51. cursor = db.cursor()
  52.  
  53. sql = """SELECT b.Job,b.Level,b.RealEndTime,b.JobFiles,b.JobBytes,b.JobErrors FROM Job AS\
  54. b INNER JOIN Client AS\
  55. c ON (c.ClientId=b.ClientID) WHERE c.Name='"""
  56. query = sql + str(namespace.client) + "'"
  57.  
  58. try:
  59. cursor.execute(query)
  60. except MySQLdb.OperationalError as error:
  61. raise RuntimeError(error)
  62.  
  63. data = cursor.fetchall()
  64. db.close()
  65.  
  66. return data
  67.  
  68.  
  69. def getTimePeriod(namespace):
  70. if namespace.period is None:
  71. return False,''
  72. if re.match('\d+[hHdDwW]',str(namespace.period)) is None:
  73. return False,''
  74. else:
  75. value = int(namespace.period[:-1])
  76. if str(namespace.period)[-1] in 'hH':
  77. deltaTime = datetime.timedelta(hours=value)
  78. unit = ' hours' if value > 1 else ' hour'
  79. elif str(namespace.period)[-1] in 'dD':
  80. deltaTime = datetime.timedelta(days=value)
  81. unit = ' days' if value > 1 else ' day'
  82. elif str(namespace.period)[-1] in 'wW':
  83. deltaTime = datetime.timedelta(weeks=value)
  84. unit = ' weeks' if value > 1 else ' week'
  85. else:
  86. return False,''
  87.  
  88. out = 'during ' + str(value) + unit
  89. currentTime = datetime.datetime.now()
  90. return (currentTime - deltaTime), out
  91.  
  92.  
  93. def parseData(namespace):
  94. try:
  95. data = list(getData(namespace))
  96. except RuntimeError as error:
  97. raise RuntimeError(error)
  98.  
  99. bkpList = []
  100. date,period = getTimePeriod(namespace)
  101.  
  102. for item in data:
  103. bkp = cBackup()
  104. bkp.name = str(str(item[0]).split('.',1)[0])
  105. bkp.type = str(item[1])
  106. bkp.date = item[2]
  107. bkp.files = int(item[3])
  108. bkp.size = int(item[4])
  109. bkp.errors = int(item[5])
  110.  
  111. if date == False and namespace.backup == 'None':
  112. bkpList.append(bkp)
  113. elif date == False and namespace.backup != 'None':
  114. if str(namespace.backup) in str(bkp.name):
  115. bkpList.append(bkp)
  116. elif date != False and namespace.backup == 'None':
  117. try:
  118. if date <= bkp.date:
  119. bkpList.append(bkp)
  120. except TypeError:
  121. pass
  122. elif date != False and namespace.backup != 'None':
  123. try:
  124. if date <= bkp.date and str(namespace.backup) in str(bkp.name):
  125. bkpList.append(bkp)
  126. except TypeError:
  127. pass
  128.  
  129. return bkpList,period
  130.  
  131.  
  132. def lastBackup(backup):
  133. if len(backup) > 0:
  134. last = backup[0]
  135. for i in backup:
  136. try:
  137. if i.date > last.date:
  138. last = i
  139. except TypeError:
  140. pass
  141. return str(str(last.name)+\
  142. ' type:'+str(last.type)+\
  143. ' date:'+str(last.date.strftime('%Y-%m-%d_%H:%M:%S'))+\
  144. ' files:'+str(last.files)+\
  145. ' size(bytes):'+str(last.size)+\
  146. ' errors:'+str(last.errors))
  147. else:
  148. return False
  149.  
  150.  
  151. def withErrors(backup):
  152. if len(backup) > 0:
  153. broken = 0
  154. for i in backup:
  155. if int(i.errors) > 0:
  156. broken += 1
  157. return broken
  158. else:
  159. return 0
  160.  
  161.  
  162. def output():
  163. namespace = parseArgs()
  164. try:
  165. backup,period = parseData(namespace)
  166. except RuntimeError as error:
  167. print error
  168. sys.exit(3)
  169. else:
  170. last = lastBackup(backup)
  171. broken = withErrors(backup)
  172.  
  173. if last:
  174. postfix = " last: " + last
  175. else:
  176. postfix = " last absent"
  177.  
  178. if len(backup) < namespace.crit:
  179. out = "CRITICAL - less " + str(namespace.crit) + " backups " + period + postfix
  180. print out
  181. sys.exit(2)
  182. elif (namespace.crit < len(backup) < namespace.warn) or broken > 0:
  183. prefix = "WARNING - less " + str(namespace.warn) + " backups " + period
  184.  
  185. if len(backup) > namespace.warn and broken > 0:
  186. out = "WARNING - " + str(broken) + " with errors"
  187. elif broken > 0:
  188. out = prefix + " with errors: " + str(broken) + postfix
  189. else:
  190. out = prefix + postfix
  191. print out
  192. sys.exit(1)
  193. else:
  194. print "OK - " + postfix
  195. sys.exit(0)
  196.  
  197. output()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement