mm1.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # -*- coding: utf-8 -*-
  2. import time
  3. import logging.config
  4. import sys
  5. import os
  6. import traceback
  7. import locale
  8. from configobj import ConfigObj
  9. from api_clients import api_client as apc
  10. from std_err_override import LogWriter
  11. from multiprocessing import Queue as mpQueue
  12. from threading import Thread
  13. from pyinotify import WatchManager
  14. from airtimefilemonitor.airtimenotifier import AirtimeNotifier
  15. from airtimefilemonitor.mediamonitorcommon import MediaMonitorCommon
  16. from airtimefilemonitor.airtimeprocessevent import AirtimeProcessEvent
  17. from airtimefilemonitor.mediaconfig import AirtimeMediaConfig
  18. from airtimefilemonitor.workerprocess import MediaMonitorWorkerProcess
  19. from airtimefilemonitor.airtimemediamonitorbootstrap import AirtimeMediaMonitorBootstrap
  20. def configure_locale():
  21. logger.debug("Before %s", locale.nl_langinfo(locale.CODESET))
  22. current_locale = locale.getlocale()
  23. if current_locale[1] is None:
  24. logger.debug("No locale currently set. Attempting to get default locale.")
  25. default_locale = locale.getdefaultlocale()
  26. if default_locale[1] is None:
  27. logger.debug("No default locale exists. Let's try loading from /etc/default/locale")
  28. if os.path.exists("/etc/default/locale"):
  29. config = ConfigObj('/etc/default/locale')
  30. lang = config.get('LANG')
  31. new_locale = lang
  32. else:
  33. logger.error("/etc/default/locale could not be found! Please run 'sudo update-locale' from command-line.")
  34. sys.exit(1)
  35. else:
  36. new_locale = default_locale
  37. logger.info("New locale set to: %s", locale.setlocale(locale.LC_ALL, new_locale))
  38. reload(sys)
  39. sys.setdefaultencoding("UTF-8")
  40. current_locale_encoding = locale.getlocale()[1].lower()
  41. logger.debug("sys default encoding %s", sys.getdefaultencoding())
  42. logger.debug("After %s", locale.nl_langinfo(locale.CODESET))
  43. if current_locale_encoding not in ['utf-8', 'utf8']:
  44. logger.error("Need a UTF-8 locale. Currently '%s'. Exiting..." % current_locale_encoding)
  45. sys.exit(1)
  46. # configure logging
  47. try:
  48. logging.config.fileConfig("%s/logging.cfg" % os.path.dirname(os.path.realpath(__file__)))
  49. #need to wait for Python 2.7 for this..
  50. #logging.captureWarnings(True)
  51. logger = logging.getLogger()
  52. LogWriter.override_std_err(logger)
  53. except Exception, e:
  54. print 'Error configuring logging: ', e
  55. sys.exit(1)
  56. logger.info("\n\n*** Media Monitor bootup ***\n\n")
  57. try:
  58. configure_locale()
  59. config = AirtimeMediaConfig(logger)
  60. api_client = apc.AirtimeApiClient()
  61. api_client.register_component("media-monitor")
  62. logger.info("Setting up monitor")
  63. response = None
  64. while response is None:
  65. response = api_client.setup_media_monitor()
  66. time.sleep(5)
  67. storage_directory = response["stor"]
  68. watched_dirs = response["watched_dirs"]
  69. logger.info("Storage Directory is: %s", storage_directory)
  70. config.storage_directory = os.path.normpath(storage_directory)
  71. config.imported_directory = os.path.normpath(os.path.join(storage_directory, 'imported'))
  72. config.organize_directory = os.path.normpath(os.path.join(storage_directory, 'organize'))
  73. config.recorded_directory = os.path.normpath(os.path.join(storage_directory, 'recorded'))
  74. config.problem_directory = os.path.normpath(os.path.join(storage_directory, 'problem_files'))
  75. dirs = [config.imported_directory, config.organize_directory, config.recorded_directory, config.problem_directory]
  76. for d in dirs:
  77. if not os.path.exists(d):
  78. os.makedirs(d, 02775)
  79. multi_queue = mpQueue()
  80. logger.info("Initializing event processor")
  81. wm = WatchManager()
  82. mmc = MediaMonitorCommon(config, wm=wm)
  83. pe = AirtimeProcessEvent(queue=multi_queue, airtime_config=config, wm=wm, mmc=mmc, api_client=api_client)
  84. bootstrap = AirtimeMediaMonitorBootstrap(logger, pe, api_client, mmc, wm, config)
  85. bootstrap.scan()
  86. notifier = AirtimeNotifier(wm, pe, read_freq=0, timeout=0, airtime_config=config, api_client=api_client, bootstrap=bootstrap, mmc=mmc)
  87. notifier.coalesce_events()
  88. #create 5 worker threads
  89. wp = MediaMonitorWorkerProcess(config, mmc)
  90. for i in range(5):
  91. threadName = "Thread #%d" % i
  92. t = Thread(target=wp.process_file_events, name=threadName, args=(multi_queue, notifier))
  93. t.start()
  94. wdd = notifier.watch_directory(storage_directory)
  95. logger.info("Added watch to %s", storage_directory)
  96. logger.info("wdd result %s", wdd[storage_directory])
  97. for dir in watched_dirs:
  98. wdd = notifier.watch_directory(dir)
  99. logger.info("Added watch to %s", dir)
  100. logger.info("wdd result %s", wdd[dir])
  101. notifier.loop(callback=pe.notifier_loop_callback)
  102. except KeyboardInterrupt:
  103. notifier.stop()
  104. logger.info("Keyboard Interrupt")
  105. except Exception, e:
  106. logger.error('Exception: %s', e)
  107. logger.error("traceback: %s", traceback.format_exc())