CC-3700: media-monitor- Surround all accesses to external resources with try/except
-fixed
This commit is contained in:
parent
86282a8d8a
commit
7c49fc77d5
|
@ -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())
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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())
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Reference in New Issue