CC-3770: Make sure files in /srv/airtime/stor have world-readable permissions.

-fixed
This commit is contained in:
Martin Konecny 2012-05-07 13:54:39 -04:00
parent c466b946a0
commit 91d1dfbbfa
2 changed files with 92 additions and 55 deletions

View file

@ -134,8 +134,9 @@ class AirtimeProcessEvent(ProcessEvent):
#file is being overwritten/replaced in GUI. #file is being overwritten/replaced in GUI.
elif "goutputstream" in pathname: elif "goutputstream" in pathname:
self.temp_files[pathname] = None self.temp_files[pathname] = None
elif self.mmc.is_audio_file(pathname) and self.mmc.is_readable(pathname, False): elif self.mmc.is_audio_file(pathname):
if self.mmc.is_parent_directory(pathname, self.config.organize_directory): if self.mmc.is_parent_directory(pathname, self.config.organize_directory):
#file was created in /srv/airtime/stor/organize. Need to process and move #file was created in /srv/airtime/stor/organize. Need to process and move
#to /srv/airtime/stor/imported #to /srv/airtime/stor/imported
oldPath = pathname oldPath = pathname
@ -144,21 +145,18 @@ class AirtimeProcessEvent(ProcessEvent):
#delete files from organize if they can not be read properly. #delete files from organize if they can not be read properly.
if pathname is None: if pathname is None:
try: try:
self.logger.info("Deleting file because it cannot be read properly: %s", oldPath) self.logger.warn("Deleting file because it cannot be read properly: %s", oldPath)
os.remove(oldPath) os.remove(oldPath)
return
except Exception, e: except Exception, e:
self.logger.error('Exception: %s', e) self.logger.error('Exception: %s', e)
self.logger.error("traceback: %s", traceback.format_exc()) self.logger.error("traceback: %s", traceback.format_exc())
else:
self.mmc.is_readable(pathname, dir) #ensure file is world readable (Liquidsoap and Web UI preview)
is_recorded = self.mmc.is_parent_directory(pathname, self.config.recorded_directory) if self.mmc.make_readable(pathname):
self.file_events.append({'mode': self.config.MODE_CREATE, 'filepath': pathname, 'is_recorded_show': is_recorded}) is_recorded = self.mmc.is_parent_directory(pathname, self.config.recorded_directory)
self.file_events.append({'mode': self.config.MODE_CREATE, 'filepath': pathname, 'is_recorded_show': is_recorded})
else: else:
#event is because of a created directory self.logger.warn("Couldn't add %s because failed to change file permissions", pathname)
if self.mmc.is_parent_directory(pathname, self.config.storage_directory):
self.mmc.is_readable(pathname, dir)
def process_IN_MODIFY(self, event): def process_IN_MODIFY(self, event):
# if IN_MODIFY is followed by IN_CREATE, it's not true modify event # if IN_MODIFY is followed by IN_CREATE, it's not true modify event
@ -175,7 +173,7 @@ class AirtimeProcessEvent(ProcessEvent):
self.create_dict[pathname] = time.time() self.create_dict[pathname] = time.time()
if not dir and not self.mmc.is_parent_directory(pathname, self.config.organize_directory): if not dir and not self.mmc.is_parent_directory(pathname, self.config.organize_directory):
self.logger.info("Modified: %s", pathname) self.logger.info("Modified: %s", pathname)
if self.mmc.is_audio_file(name): if self.mmc.is_audio_file(name) and self.mmc.make_readable(pathname):
self.file_events.append({'filepath': pathname, 'mode': self.config.MODE_MODIFY}) self.file_events.append({'filepath': pathname, 'mode': self.config.MODE_MODIFY})
# if change is detected on /etc/mtab, we check what mount(file system) was added/removed # if change is detected on /etc/mtab, we check what mount(file system) was added/removed
@ -238,51 +236,52 @@ class AirtimeProcessEvent(ProcessEvent):
self.handle_mount_change() self.handle_mount_change()
if not event.dir: if not event.dir:
if self.mmc.is_audio_file(event.name) and self.mmc.is_readable(event.pathname, False): if self.mmc.is_audio_file(event.name):
if event.cookie in self.temp_files: if self.mmc.make_readable(event.pathname):
self.file_events.append({'filepath': event.pathname, 'mode': self.config.MODE_MODIFY}) if event.cookie in self.temp_files:
del self.temp_files[event.cookie] self.file_events.append({'filepath': event.pathname, 'mode': self.config.MODE_MODIFY})
elif event.cookie in self.cookies_IN_MOVED_FROM: del self.temp_files[event.cookie]
#files original location was also in a watched directory elif event.cookie in self.cookies_IN_MOVED_FROM:
del self.cookies_IN_MOVED_FROM[event.cookie] #files original location was also in a watched directory
if self.mmc.is_parent_directory(event.pathname, self.config.organize_directory): del self.cookies_IN_MOVED_FROM[event.cookie]
filepath = self.mmc.organize_new_file(event.pathname) if self.mmc.is_parent_directory(event.pathname, self.config.organize_directory):
filepath = self.mmc.organize_new_file(event.pathname)
#delete files from organize if they can not be read properly. #delete files from organize if they can not be read properly.
if filepath is None: if filepath is None:
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 return
except Exception, e: except Exception, e:
self.logger.error('Exception: %s', e) self.logger.error('Exception: %s', e)
self.logger.error("traceback: %s", traceback.format_exc()) self.logger.error("traceback: %s", traceback.format_exc())
else:
filepath = event.pathname
if (filepath is not None):
self.file_events.append({'filepath': filepath, 'mode': self.config.MODE_MOVED})
else: else:
filepath = event.pathname if self.mmc.is_parent_directory(event.pathname, self.config.organize_directory):
filepath = self.mmc.organize_new_file(event.pathname)
if (filepath is not None): #delete files from organize if they can not be read properly.
self.file_events.append({'filepath': filepath, 'mode': self.config.MODE_MOVED}) if filepath is None:
else: try:
if self.mmc.is_parent_directory(event.pathname, self.config.organize_directory): self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname)
filepath = self.mmc.organize_new_file(event.pathname) os.remove(event.pathname)
return
#delete files from organize if they can not be read properly. except Exception, e:
if filepath is None: self.logger.error('Exception: %s', e)
try: self.logger.error("traceback: %s", traceback.format_exc())
self.logger.info("Deleting file because it cannot be read properly: %s", event.pathname) else:
os.remove(event.pathname) #show dragged from unwatched folder into a watched folder. Do not "organize".:q!
return if self.mmc.is_parent_directory(event.pathname, self.config.recorded_directory):
except Exception, e: is_recorded = True
self.logger.error('Exception: %s', e) else:
self.logger.error("traceback: %s", traceback.format_exc()) is_recorded = False
else: self.file_events.append({'mode': self.config.MODE_CREATE, 'filepath': event.pathname, 'is_recorded_show': is_recorded})
#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):
is_recorded = True
else :
is_recorded = False
self.file_events.append({'mode': self.config.MODE_CREATE, 'filepath': event.pathname, 'is_recorded_show': is_recorded})
else: else:
#When we move a directory into a watched_dir, we only get a notification that the dir was created, #When we move a directory into a watched_dir, we only get a notification that the dir was created,
#and no additional information about files that came along with that directory. #and no additional information about files that came along with that directory.

View file

@ -84,6 +84,44 @@ class MediaMonitorCommon:
self.logger.warn("Failed to check owner/group/permissions for %s", item) self.logger.warn("Failed to check owner/group/permissions for %s", item)
return False return False
def make_file_readable(self, pathname, is_dir):
if is_dir:
#set to 755
os.chmod(pathname, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR | stat.S_IRGRP|stat.S_IXGRP | stat.S_IROTH|stat.S_IXOTH)
else:
#set to 644
os.chmod(pathname, stat.S_IRUSR|stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
def make_readable(self, pathname):
"""
Should only call this function if is_readable() returns False. This function
will attempt to make the file world readable by modifying the file's permission's
as well as the file's parent directory permissions. We should only call this function
on files in Airtime's stor directory, not watched directories!
Returns True if we were able to make the file world readable. False otherwise.
"""
original_file = pathname
is_dir = False
try:
while not is_readable(original_file, is_dir):
#Not readable. Make appropriate permission changes.
self.make_file_readable(pathname, is_dir)
dirname = os.path.dirname(pathname)
if dirname == pathname:
#most likey reason for this is that we've hit '/'. Avoid infinite loop by terminating loop
raise Exception()
else:
pathname = dirname
is_dir = True
except Exception, e:
#something went wrong while we were trying to make world readable.
return False
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.
#Otherwise prints error to log file. #Otherwise prints error to log file.
def ensure_is_dir(self, directory): def ensure_is_dir(self, directory):