CC-3700: media-monitor- Surround all accesses to external resources with try/except

-fixed
This commit is contained in:
Martin Konecny 2012-04-22 13:42:45 -04:00
parent 86282a8d8a
commit 7c49fc77d5
7 changed files with 58 additions and 37 deletions

View File

@ -4,6 +4,7 @@ import logging.config
import sys import sys
import os import os
import signal import signal
import traceback
from api_clients import api_client as apc from api_clients import api_client as apc
from std_err_override import LogWriter from std_err_override import LogWriter
@ -59,7 +60,8 @@ try:
multi_queue = mpQueue() multi_queue = mpQueue()
logger.info("Initializing event processor") logger.info("Initializing event processor")
except Exception, e: except Exception, e:
logger.error('Exception: %s', e) logger.error('Exception: %s', e)
logger.error("traceback: %s", traceback.format_exc())
try: try:
@ -96,7 +98,5 @@ except KeyboardInterrupt:
notifier.stop() notifier.stop()
logger.info("Keyboard Interrupt") logger.info("Keyboard Interrupt")
except Exception, e: except Exception, e:
import traceback
top = traceback.format_exc()
logger.error('Exception: %s', e) logger.error('Exception: %s', e)
logger.error("traceback: %s", top) logger.error("traceback: %s", traceback.format_exc())

View File

@ -140,9 +140,7 @@ class AirtimeMetadata:
if key in self.mutagen2airtime and len(file_info[key]) > 0: if key in self.mutagen2airtime and len(file_info[key]) > 0:
md[self.mutagen2airtime[key]] = file_info[key][0] md[self.mutagen2airtime[key]] = file_info[key][0]
if 'MDATA_KEY_TITLE' not in md: if 'MDATA_KEY_TITLE' not in md:
#get rid of file extention from original name, name might have more than 1 '.' in it. #get rid of file extension from original name, name might have more than 1 '.' in it.
#filepath = to_unicode(filepath)
#filepath = filepath.encode('utf-8')
original_name = os.path.basename(filepath) original_name = os.path.basename(filepath)
original_name = original_name.split(".")[0:-1] original_name = original_name.split(".")[0:-1]
original_name = ''.join(original_name) original_name = ''.join(original_name)

View File

@ -2,6 +2,7 @@ import json
import time import time
import os import os
import logging import logging
import traceback
# For RabbitMQ # For RabbitMQ
from kombu.connection import BrokerConnection from kombu.connection import BrokerConnection
@ -116,7 +117,11 @@ class AirtimeNotifier(Notifier):
if m['delete']: if m['delete']:
self.logger.info("Deleting file: %s ", filepath) 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())
""" """

View File

@ -4,6 +4,7 @@ import time
import os import os
import shutil import shutil
import difflib import difflib
import traceback
import pyinotify import pyinotify
from pyinotify import ProcessEvent from pyinotify import ProcessEvent
@ -147,10 +148,8 @@ class AirtimeProcessEvent(ProcessEvent):
os.remove(oldPath) os.remove(oldPath)
return return
except Exception, e: except Exception, e:
import traceback
top = traceback.format_exc()
self.logger.error('Exception: %s', e) 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) self.mmc.set_needed_file_permissions(pathname, dir)
is_recorded = self.mmc.is_parent_directory(pathname, self.config.recorded_directory) is_recorded = self.mmc.is_parent_directory(pathname, self.config.recorded_directory)
@ -255,11 +254,10 @@ class AirtimeProcessEvent(ProcessEvent):
try: try:
self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname) self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname)
os.remove(event.pathname) os.remove(event.pathname)
return
except Exception, e: except Exception, e:
import traceback
top = traceback.format_exc()
self.logger.error('Exception: %s', e) self.logger.error('Exception: %s', e)
self.logger.error("traceback: %s", top) self.logger.error("traceback: %s", traceback.format_exc())
else: else:
filepath = event.pathname filepath = event.pathname
@ -275,11 +273,10 @@ class AirtimeProcessEvent(ProcessEvent):
try: try:
self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname) self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname)
os.remove(event.pathname) os.remove(event.pathname)
return
except Exception, e: except Exception, e:
import traceback
top = traceback.format_exc()
self.logger.error('Exception: %s', e) self.logger.error('Exception: %s', e)
self.logger.error("traceback: %s", top) self.logger.error("traceback: %s", traceback.format_exc())
else: else:
#show dragged from unwatched folder into a watched folder. Do not "organize".:q! #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): 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 # handling those cases. We are manully calling handle_created_file
# function. # function.
if os.path.exists(k): if os.path.exists(k):
# check if file is open # check if file is open
command = "lsof "+k try:
f = os.popen(command) 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(): if not f.readlines():
self.logger.info("Handling file: %s", k) self.logger.info("Handling file: %s", k)
self.handle_created_file(False, k, os.path.basename(k)) self.handle_created_file(False, k, os.path.basename(k))
@ -387,9 +390,7 @@ class AirtimeProcessEvent(ProcessEvent):
except socket.timeout: except socket.timeout:
pass pass
except Exception, e: except Exception, e:
import traceback
top = traceback.format_exc()
self.logger.error('Exception: %s', e) self.logger.error('Exception: %s', e)
self.logger.error("traceback: %s", top) self.logger.error("traceback: %s", traceback.format_exc())
time.sleep(3) time.sleep(3)

View File

@ -18,7 +18,7 @@ class AirtimeMediaConfig:
self.cfg = config self.cfg = config
except Exception, e: except Exception, e:
logger.info('Error loading config: ', e) logger.info('Error loading config: ', e)
sys.exit() sys.exit(1)
self.storage_directory = None self.storage_directory = None

View File

@ -4,6 +4,7 @@ import pwd
import logging import logging
import stat import stat
import subprocess import subprocess
import traceback
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
from airtimemetadata import AirtimeMetadata from airtimemetadata import AirtimeMetadata
@ -49,22 +50,25 @@ class MediaMonitorCommon:
#check if file is readable by "nobody" #check if file is readable by "nobody"
def has_correct_permissions(self, filepath, euid='nobody', egid='nogroup'): 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: 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) open(filepath)
readable = True readable = True
except IOError: except IOError:
self.logger.warn("File does not have correct permissions: '%s'", filepath) self.logger.warn("File does not have correct permissions: '%s'", filepath)
readable = False readable = False
self.logger.error("traceback: %s", traceback.format_exc())
except Exception, e: except Exception, e:
self.logger.error("Unexpected exception thrown: %s", e) self.logger.error("Unexpected exception thrown: %s", e)
readable = False readable = False
self.logger.error("traceback: %s", traceback.format_exc())
finally: finally:
#reset effective user to root #reset effective user to root
os.seteuid(0) os.seteuid(0)
@ -96,10 +100,11 @@ class MediaMonitorCommon:
os.chmod(item, bitor) os.chmod(item, bitor)
except Exception, e: except Exception, e:
self.logger.error("Failed to change file's owner/group/permissions. %s", 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: finally:
os.umask(omask) os.umask(omask)
return True; return True
#checks if path is a directory, and if it doesnt exist, then creates it. #checks if path is a directory, and if it doesnt exist, then creates it.
@ -125,6 +130,7 @@ class MediaMonitorCommon:
os.rename(source, dest) os.rename(source, dest)
except Exception, e: except Exception, e:
self.logger.error("failed to move file. %s", e) self.logger.error("failed to move file. %s", e)
self.logger.error("traceback: %s", traceback.format_exc())
finally: finally:
os.umask(omask) os.umask(omask)
@ -137,8 +143,13 @@ class MediaMonitorCommon:
def cleanup_empty_dirs(self, dir): def cleanup_empty_dirs(self, dir):
if os.path.normpath(dir) != self.config.organize_directory: if os.path.normpath(dir) != self.config.organize_directory:
if len(os.listdir(dir)) == 0: 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) pdir = os.path.dirname(dir)
self.cleanup_empty_dirs(pdir) self.cleanup_empty_dirs(pdir)
@ -272,9 +283,13 @@ class MediaMonitorCommon:
def touch_index_file(self): def touch_index_file(self):
dirname = os.path.dirname(self.timestamp_file) dirname = os.path.dirname(self.timestamp_file)
if not os.path.exists(dirname): try:
os.makedirs(dirname) if not os.path.exists(dirname):
open(self.timestamp_file, "w") 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): def organize_new_file(self, pathname):
self.logger.info("Organizing new file: %s", pathname) self.logger.info("Organizing new file: %s", pathname)

View File

@ -1,5 +1,6 @@
from mediaconfig import AirtimeMediaConfig from mediaconfig import AirtimeMediaConfig
import mediamonitorcommon import mediamonitorcommon
import traceback
class MediaMonitorWorkerProcess: class MediaMonitorWorkerProcess:
@ -20,3 +21,4 @@ class MediaMonitorWorkerProcess:
notifier.update_airtime(event) notifier.update_airtime(event)
except Exception, e: except Exception, e:
notifier.logger.error(e) notifier.logger.error(e)
notifier.logger.error("traceback: %s", traceback.format_exc())