From 7c49fc77d51cea8c1bec26de91481fded24fa6a3 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Sun, 22 Apr 2012 13:42:45 -0400 Subject: [PATCH] CC-3700: media-monitor- Surround all accesses to external resources with try/except -fixed --- python_apps/media-monitor/MediaMonitor.py | 8 ++-- .../airtimefilemonitor/airtimemetadata.py | 4 +- .../airtimefilemonitor/airtimenotifier.py | 7 +++- .../airtimefilemonitor/airtimeprocessevent.py | 31 +++++++------- .../airtimefilemonitor/mediaconfig.py | 2 +- .../airtimefilemonitor/mediamonitorcommon.py | 41 +++++++++++++------ .../airtimefilemonitor/workerprocess.py | 2 + 7 files changed, 58 insertions(+), 37 deletions(-) diff --git a/python_apps/media-monitor/MediaMonitor.py b/python_apps/media-monitor/MediaMonitor.py index d3f8bb0cd..3fa9fe912 100644 --- a/python_apps/media-monitor/MediaMonitor.py +++ b/python_apps/media-monitor/MediaMonitor.py @@ -4,6 +4,7 @@ import logging.config import sys import os import signal +import traceback from api_clients import api_client as apc from std_err_override import LogWriter @@ -59,7 +60,8 @@ try: multi_queue = mpQueue() logger.info("Initializing event processor") except Exception, e: - logger.error('Exception: %s', e) + logger.error('Exception: %s', e) + logger.error("traceback: %s", traceback.format_exc()) try: @@ -96,7 +98,5 @@ except KeyboardInterrupt: notifier.stop() logger.info("Keyboard Interrupt") except Exception, e: - import traceback - top = traceback.format_exc() logger.error('Exception: %s', e) - logger.error("traceback: %s", top) + logger.error("traceback: %s", traceback.format_exc()) diff --git a/python_apps/media-monitor/airtimefilemonitor/airtimemetadata.py b/python_apps/media-monitor/airtimefilemonitor/airtimemetadata.py index ad5047380..cab57381c 100644 --- a/python_apps/media-monitor/airtimefilemonitor/airtimemetadata.py +++ b/python_apps/media-monitor/airtimefilemonitor/airtimemetadata.py @@ -140,9 +140,7 @@ class AirtimeMetadata: if key in self.mutagen2airtime and len(file_info[key]) > 0: md[self.mutagen2airtime[key]] = file_info[key][0] if 'MDATA_KEY_TITLE' not in md: - #get rid of file extention from original name, name might have more than 1 '.' in it. - #filepath = to_unicode(filepath) - #filepath = filepath.encode('utf-8') + #get rid of file extension from original name, name might have more than 1 '.' in it. original_name = os.path.basename(filepath) original_name = original_name.split(".")[0:-1] original_name = ''.join(original_name) diff --git a/python_apps/media-monitor/airtimefilemonitor/airtimenotifier.py b/python_apps/media-monitor/airtimefilemonitor/airtimenotifier.py index 72dee15f2..42f22b0ba 100644 --- a/python_apps/media-monitor/airtimefilemonitor/airtimenotifier.py +++ b/python_apps/media-monitor/airtimefilemonitor/airtimenotifier.py @@ -2,6 +2,7 @@ import json import time import os import logging +import traceback # For RabbitMQ from kombu.connection import BrokerConnection @@ -116,7 +117,11 @@ class AirtimeNotifier(Notifier): if m['delete']: self.logger.info("Deleting file: %s ", filepath) - os.unlink(filepath) + try: + os.unlink(filepath) + except Exception, e: + self.logger.error('Exception: %s', e) + self.logger.error("traceback: %s", traceback.format_exc()) """ diff --git a/python_apps/media-monitor/airtimefilemonitor/airtimeprocessevent.py b/python_apps/media-monitor/airtimefilemonitor/airtimeprocessevent.py index e1e847b41..0d6a6e602 100644 --- a/python_apps/media-monitor/airtimefilemonitor/airtimeprocessevent.py +++ b/python_apps/media-monitor/airtimefilemonitor/airtimeprocessevent.py @@ -4,6 +4,7 @@ import time import os import shutil import difflib +import traceback import pyinotify from pyinotify import ProcessEvent @@ -147,10 +148,8 @@ class AirtimeProcessEvent(ProcessEvent): os.remove(oldPath) return except Exception, e: - import traceback - top = traceback.format_exc() self.logger.error('Exception: %s', e) - self.logger.error("traceback: %s", top) + self.logger.error("traceback: %s", traceback.format_exc()) self.mmc.set_needed_file_permissions(pathname, dir) is_recorded = self.mmc.is_parent_directory(pathname, self.config.recorded_directory) @@ -255,11 +254,10 @@ class AirtimeProcessEvent(ProcessEvent): try: self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname) os.remove(event.pathname) + return except Exception, e: - import traceback - top = traceback.format_exc() self.logger.error('Exception: %s', e) - self.logger.error("traceback: %s", top) + self.logger.error("traceback: %s", traceback.format_exc()) else: filepath = event.pathname @@ -275,11 +273,10 @@ class AirtimeProcessEvent(ProcessEvent): try: self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname) os.remove(event.pathname) + return except Exception, e: - import traceback - top = traceback.format_exc() self.logger.error('Exception: %s', e) - self.logger.error("traceback: %s", top) + self.logger.error("traceback: %s", traceback.format_exc()) else: #show dragged from unwatched folder into a watched folder. Do not "organize".:q! if self.mmc.is_parent_directory(event.pathname, self.config.recorded_directory): @@ -370,9 +367,15 @@ class AirtimeProcessEvent(ProcessEvent): # handling those cases. We are manully calling handle_created_file # function. if os.path.exists(k): - # check if file is open - command = "lsof "+k - f = os.popen(command) + # check if file is open + try: + command = "lsof "+k + f = os.popen(command) + except Exception, e: + self.logger.error('Exception: %s', e) + self.logger.error("traceback: %s", traceback.format_exc()) + continue + if not f.readlines(): self.logger.info("Handling file: %s", k) self.handle_created_file(False, k, os.path.basename(k)) @@ -387,9 +390,7 @@ class AirtimeProcessEvent(ProcessEvent): except socket.timeout: pass except Exception, e: - import traceback - top = traceback.format_exc() self.logger.error('Exception: %s', e) - self.logger.error("traceback: %s", top) + self.logger.error("traceback: %s", traceback.format_exc()) time.sleep(3) diff --git a/python_apps/media-monitor/airtimefilemonitor/mediaconfig.py b/python_apps/media-monitor/airtimefilemonitor/mediaconfig.py index 2ddd71680..1d60d7b97 100644 --- a/python_apps/media-monitor/airtimefilemonitor/mediaconfig.py +++ b/python_apps/media-monitor/airtimefilemonitor/mediaconfig.py @@ -18,7 +18,7 @@ class AirtimeMediaConfig: self.cfg = config except Exception, e: logger.info('Error loading config: ', e) - sys.exit() + sys.exit(1) self.storage_directory = None diff --git a/python_apps/media-monitor/airtimefilemonitor/mediamonitorcommon.py b/python_apps/media-monitor/airtimefilemonitor/mediamonitorcommon.py index 4563915a8..7a6e833c1 100644 --- a/python_apps/media-monitor/airtimefilemonitor/mediamonitorcommon.py +++ b/python_apps/media-monitor/airtimefilemonitor/mediamonitorcommon.py @@ -4,6 +4,7 @@ import pwd import logging import stat import subprocess +import traceback from subprocess import Popen, PIPE from airtimemetadata import AirtimeMetadata @@ -49,22 +50,25 @@ class MediaMonitorCommon: #check if file is readable by "nobody" def has_correct_permissions(self, filepath, euid='nobody', egid='nogroup'): - uid = pwd.getpwnam(euid)[2] - gid = grp.getgrnam(egid)[2] - - #drop root permissions and become "nobody" - os.setegid(gid) - os.seteuid(uid) try: + uid = pwd.getpwnam(euid)[2] + gid = grp.getgrnam(egid)[2] + + #drop root permissions and become "nobody" + os.setegid(gid) + os.seteuid(uid) + open(filepath) readable = True except IOError: self.logger.warn("File does not have correct permissions: '%s'", filepath) readable = False + self.logger.error("traceback: %s", traceback.format_exc()) except Exception, e: self.logger.error("Unexpected exception thrown: %s", e) readable = False + self.logger.error("traceback: %s", traceback.format_exc()) finally: #reset effective user to root os.seteuid(0) @@ -96,10 +100,11 @@ class MediaMonitorCommon: os.chmod(item, bitor) except Exception, e: self.logger.error("Failed to change file's owner/group/permissions. %s", e) - return False; + self.logger.error("traceback: %s", traceback.format_exc()) + return False finally: os.umask(omask) - return True; + return True #checks if path is a directory, and if it doesnt exist, then creates it. @@ -125,6 +130,7 @@ class MediaMonitorCommon: os.rename(source, dest) except Exception, e: self.logger.error("failed to move file. %s", e) + self.logger.error("traceback: %s", traceback.format_exc()) finally: os.umask(omask) @@ -137,8 +143,13 @@ class MediaMonitorCommon: def cleanup_empty_dirs(self, dir): if os.path.normpath(dir) != self.config.organize_directory: if len(os.listdir(dir)) == 0: - os.rmdir(dir) - + try: + os.rmdir(dir) + except Exception, e: + #non-critical exception because we probably tried to delete a non-empty dir. + #Don't need to log this, let's just "return" + return + pdir = os.path.dirname(dir) self.cleanup_empty_dirs(pdir) @@ -272,9 +283,13 @@ class MediaMonitorCommon: def touch_index_file(self): dirname = os.path.dirname(self.timestamp_file) - if not os.path.exists(dirname): - os.makedirs(dirname) - open(self.timestamp_file, "w") + try: + if not os.path.exists(dirname): + os.makedirs(dirname) + open(self.timestamp_file, "w") + except Exception, e: + self.logger.error('Exception: %s', e) + self.logger.error("traceback: %s", traceback.format_exc()) def organize_new_file(self, pathname): self.logger.info("Organizing new file: %s", pathname) diff --git a/python_apps/media-monitor/airtimefilemonitor/workerprocess.py b/python_apps/media-monitor/airtimefilemonitor/workerprocess.py index ddbea39a6..5e8fddcb6 100644 --- a/python_apps/media-monitor/airtimefilemonitor/workerprocess.py +++ b/python_apps/media-monitor/airtimefilemonitor/workerprocess.py @@ -1,5 +1,6 @@ from mediaconfig import AirtimeMediaConfig import mediamonitorcommon +import traceback class MediaMonitorWorkerProcess: @@ -20,3 +21,4 @@ class MediaMonitorWorkerProcess: notifier.update_airtime(event) except Exception, e: notifier.logger.error(e) + notifier.logger.error("traceback: %s", traceback.format_exc())