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 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())

View File

@ -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)

View File

@ -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())
"""

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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())