Guest User

Untitled

a guest
Nov 22nd, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import smtplib
  4. import re
  5. import os
  6.  
  7. from datetime import datetime
  8. from jinja2 import Environment, FileSystemLoader
  9. from email.mime.multipart import MIMEMultipart
  10. from email.mime.text import MIMEText
  11.  
  12.  
  13. log_path = os.path.expanduser('~/unison.log')
  14. error_log_path = os.path.expanduser('~/unison_error.log')
  15. directory_path = os.path.expanduser('~')
  16. emails = lambda _: _
  17. emails.gmail = lambda _: _
  18. emails.gmail.username = 'canada.sync.log@gmail.com'
  19. emails.gmail.password = 'canadacanada'
  20. emails.receipients = [
  21. 'gallery@canadanewyork.com',
  22. ]
  23. origins = {'//server.canada.private//Volumes/Gallery Data': 'Gallery',
  24. '/Volumes/Clone of Gallery Data/gallery clone': 'Amherst'}
  25.  
  26.  
  27. def analyze_log(log):
  28. data = lambda _: _
  29. data.date_time = {}
  30. data.items = []
  31. for line in log:
  32. data = analyze_line(line, data)
  33. send_email(data)
  34.  
  35.  
  36. class item(object):
  37. def __init__(self, file_location, operation, origin=None, destination=None):
  38. self.origins = origins.copy()
  39. self.file_location = file_location
  40. self.operation = operation
  41. if origin:
  42. self.origin = self.origins[origin]
  43. self.origins.pop(origin)
  44. self.destination = self.origins.values()[0]
  45. elif destination:
  46. self.destination = self.origins[destination]
  47. self.origins.pop(destination)
  48. self.origin = self.origins.values()[0]
  49.  
  50.  
  51. def analyze_line(line, data):
  52. transfer = re.match(r"""
  53. \[BGN\][ ]
  54. (?P<operation>[a-zA-Z ]+?)[ ]
  55. (?P<file_location>((?!file[ ]).)+?) #Not starting with ' file'
  56. [ ]from[ ]
  57. (?P<origin>({0}|{1}))(([ ]to[ ]({0}|{1}))|$)
  58. """.format(*(re.escape(key) for key in origins.keys())), line, re.VERBOSE)
  59. date_time = re.match(r"""
  60. UNISON[ ][0-9.]+[ ]
  61. (?P<location>[a-z]+)[a-z ]+
  62. (?P<date_time>.+)
  63. """, line, re.VERBOSE)
  64. failed = re.match(r' failed: (?P<file_location>.+)', line)
  65. conflict = re.match(r'\[CONFLICT\] Skipping (?P<file_location>.+)', line)
  66.  
  67. if transfer:
  68. transfer_dict = transfer.groupdict()
  69. operations = {'Copying': 'Copied',
  70. 'Deleting': 'Deleted',
  71. 'Updating file': 'Updated',
  72. }
  73. transfer_dict['operation'] = operations[transfer_dict['operation']]
  74. if transfer.group('operation') == 'Deleting':
  75. transfer_dict['destination'] = transfer_dict.pop('origin')
  76. data.items.append(item(**transfer_dict))
  77.  
  78. elif failed:
  79. failed_dict = failed.groupdict()
  80. data = remove_file_record(data, failed_dict['file_location'])
  81. data.items.append(item(operation='Failed', **failed_dict))
  82.  
  83. elif conflict:
  84. conflict_dict = conflict.groupdict()
  85. data = remove_file_record(data, conflict_dict['file_location'])
  86. data.items.append(item(operation='Conflict', **conflict_dict))
  87.  
  88. elif date_time:
  89. date_time = date_time.groupdict()
  90. data.date_time[date_time['location']] = date_time['date_time']
  91. return data
  92.  
  93.  
  94. def remove_file_record(data, file_location):
  95. [data.items.remove(item) for item in data.items if item.file_location == file_location]
  96. return data
  97.  
  98.  
  99. def send_email(data):
  100. msg = MIMEMultipart('alternative')
  101. msg['Subject'] = 'Completed: {} items synced'.format(len(data.items))
  102. msg['From'] = emails.gmail.username
  103. msg['To'] = ', '.join(emails.receipients)
  104. text, html = compile_email(data)
  105. part1 = MIMEText(text, 'plain')
  106. part2 = MIMEText(html, 'html')
  107. msg.attach(part1)
  108. msg.attach(part2)
  109. server = smtplib.SMTP('smtp.gmail.com', 587)
  110. server.ehlo()
  111. server.starttls()
  112. server.ehlo()
  113. server.login(emails.gmail.username, emails.gmail.password)
  114. server.sendmail(msg['From'], emails.receipients, msg.as_string())
  115. server.quit()
  116.  
  117.  
  118. def compile_email(data):
  119. loader = FileSystemLoader(directory_path)
  120. env = Environment(trim_blocks=True, loader=loader)
  121. env.globals['time_diff'] = time_diff
  122. context = {
  123. 'items': sorted(data.items, key=lambda item: item.file_location),
  124. 'time_diff': time_diff(**data.date_time),
  125. }
  126. html = env.get_template('sync.html').render(**context)
  127. text = env.get_template('sync.txt').render(**context)
  128. return text, html
  129.  
  130.  
  131. def time_diff(started=None, finished=None):
  132. if (started or finished) == None:
  133. return None
  134. format = '%H:%M:%S.%f on %d %b %Y'
  135. start = datetime.strptime(started, format)
  136. finish = datetime.strptime(finished, format)
  137. return str(finish - start)
  138.  
  139.  
  140. def run():
  141. try:
  142. log = open(log_path)
  143. except IOError:
  144. log = ''
  145. analyze_log(log)
  146. else:
  147. analyze_log(log)
  148. os.rename(log_path, log_path + '.old')
  149. log.close()
  150. run()
Add Comment
Please, Sign In to add comment