cron_task.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env python2
  2. import signal
  3. import traceback
  4. from sys import stderr
  5. from datetime import datetime, timedelta
  6. from ffdnispdb.crawler import TextValidator
  7. from ffdnispdb.models import ISP
  8. from ffdnispdb import db
  9. MAX_RUNTIME=15*60
  10. class Timeout(Exception):
  11. pass
  12. class ScriptTimeout(Exception):
  13. """
  14. Script exceeded its allowed run time
  15. """
  16. strike=1
  17. last_isp=-1
  18. script_begin=datetime.now()
  19. def timeout_handler(signum, frame):
  20. global last_isp, strike
  21. if script_begin < datetime.now()-timedelta(seconds=MAX_RUNTIME):
  22. raise ScriptTimeout
  23. if last_isp == isp.id:
  24. strike += 1
  25. if strike > 2:
  26. # three strikes, you're out.
  27. print "you're out", isp
  28. signal.alarm(6)
  29. raise Timeout
  30. else:
  31. last_isp = isp.id
  32. strike = 1
  33. signal.alarm(6)
  34. signal.signal(signal.SIGALRM, timeout_handler)
  35. signal.alarm(6)
  36. try:
  37. for isp in ISP.query.filter(ISP.is_disabled == False,
  38. ISP.json_url != None,
  39. ISP.next_update < datetime.now(),
  40. ISP.update_error_strike < 3)\
  41. .order_by(ISP.last_update_success):
  42. try:
  43. print u'%s: Attempting to update %s'%(datetime.now(), isp)
  44. print u' last successful update=%s'%(isp.last_update_success)
  45. print u' last update attempt=%s'%(isp.last_update_attempt)
  46. print u' next update was scheduled %s ago'%(datetime.now()-isp.next_update)
  47. print u' strike=%d'%(isp.update_error_strike)
  48. isp.last_update_attempt=datetime.now()
  49. db.session.add(isp)
  50. db.session.commit()
  51. validator=TextValidator()
  52. log=''.join(validator(isp.json_url+'ab'))
  53. if not validator.success: # handle error
  54. isp.update_error_strike += 1
  55. #isp.next_update = bla
  56. db.session.add(isp)
  57. db.session.commit()
  58. print u'%s: Error while updating:'%(datetime.now())
  59. if isp.update_error_strike >= 3:
  60. # send email
  61. print u' three strikes, you\'re out'
  62. print log.rstrip()+'\n'
  63. continue
  64. isp.json = validator.jdict
  65. isp.last_update_success = isp.last_update_attempt
  66. isp.update_error_strike = 0
  67. #isp.next_update = bla
  68. db.session.add(isp)
  69. db.session.commit()
  70. print u'%s: Update successful !'%(datetime.now())
  71. print u' next update is scheduled for %s\n'%(isp.next_update)
  72. except Timeout:
  73. print u'%s: Timeout while updating:'%(datetime.now())
  74. isp=ISP.query.get(isp.id)
  75. isp.update_error_strike += 1
  76. db.session.add(isp)
  77. db.session.commit()
  78. if isp.update_error_strike >= 3:
  79. # send email
  80. print u' three strikes, you\'re out'
  81. print traceback.format_exc()
  82. except ScriptTimeout:
  83. pass
  84. except Timeout:
  85. pass