#!/usr/bin/python3 from gi.repository import GLib from pydbus import SystemBus import isodumper.raw_write as raw_write import threading import gettext import logging DEAMON_ORG = 'org.mageia.Magiback' DEAMON_INTERFACE = DEAMON_ORG ISODUMPER_INTERFACE = DEAMON_ORG + ".Isodumper" logging.basicConfig(filename="/var/log/magiback.log",format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S',level=logging.DEBUG) class Isodumper(raw_write.Dumper): """ """ def __init__(self): super().__init__() APP="isodumper" DIR="/usr/share/locale" # Call translation catalog gettext.install(APP, localedir=DIR,) self.finished = threading.Event() # finished is cleared at start of operation, and set at the end self.finished.clear() self._progress = 0 self.loop = GLib.MainLoop() self.return_state = False self.return_message = "" self.authorized_sender_read = set() self.authorized_sender_write = set() self.sum_check = "" self.sum_check_searched = False self.signature_checked = False self.writing_perm = False self.writing_target = "" def do_write(self,source, target, size, dbus_context): self.finished.clear() if check_permission('org.mageia.Magiback.Isodumper.write',dbus_context): self.thread = threading.Thread(target=self._do_write, args=(source, target, size, )) self.thread.start() logging.debug("Writing thread started") self.writing_perm = True self.writing_target = target else: self.return_message = "Writing: Access denied" logging.debug(self.return_message) self.finished.set() def do_persistence(self, target, label, key): self.finished.clear() if self.writing_perm and self.writing_target == target : self._do_persistence(target, label, key) else: self.return_message = "Persistence: Access denied" self.writing_perm = False self.writing_target = "" @property def done(self): return self.finished.wait(1) @property def message(self): return self.return_message @property def state(self): return self.return_state def end(self): if hasattr(self, 'thread'): self.thread.join() self._progress = 0 self.finished.clear() return self.return_state, self.return_message @property def progress(self): return self._progress def do_unmount(self, device): return self._do_unmount([device]) def get_sum(self, source): self.key_thread = threading.Thread(target=self._get_sum, args=(source,)) self.key_thread.start() def check_write(self,target, source): if hasattr(self, 'key_thread'): self.key_thread.join() self.thread = threading.Thread(target=self._check_write, args=(target, source,)) self.thread.start() def run(self): self.loop.run() def check_permission(action, dbus_context): """ Check permission """ return dbus_context.is_authorized(action, {'polkit.icon_name': 'isodumper.png',}, interactive=True) class ConfFile(object): """ """ def __init__(self): super().__init__() def setName(self,file_name): self.file_name = file_name def getFile(self): with open(self.file_name,'r') as tcf : # read the file content="" while 1: line = tcf.readline() if not line: break content += line return content def saveFile(self, tc, dbus_context): if check_permission('org.mageia.Magiback.write',dbus_context): try: with open(self.file_name,'w') as tcf : tcf.write(tc) except: return False return True if __name__ == '__main__': print("Running Magiback service.") bus = SystemBus() conf_file = ConfFile() bus.publish(DEAMON_ORG, conf_file, ("Isodumper", Isodumper())) loop = GLib.MainLoop() loop.run() logging.shutdown()