diff options
Diffstat (limited to 'backend/magiback')
-rwxr-xr-x | backend/magiback | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/backend/magiback b/backend/magiback new file mode 100755 index 0000000..796ba78 --- /dev/null +++ b/backend/magiback @@ -0,0 +1,174 @@ +#!/usr/bin/python3 + +from gi.repository import GLib +from pydbus import SystemBus +import raw_write +import logging +import threading + +DEAMON_ORG = 'org.mageia.Magiback' +DEAMON_INTERFACE = DEAMON_ORG +ISODUMPER_INTERFACE = DEAMON_ORG + ".Isodumper" +logger = logging.getLogger('magiback.system') + + +class Isodumper(raw_write.Dumper): + """ + <node> + <interface name='org.mageia.Magiback.Isodumper'> + <method name='do_write'> + <arg type='s' name='source' direction='in'/> + <arg type='s' name='target' direction='in'/> + </method> + <method name='do_unmount'> + <arg type='s' name='device' direction='in'/> + <arg type='b' name='success' direction='out'/> + <arg type='s' name='message' direction='out'/> + </method> + <method name='do_format'> + <arg type='s' name='device' direction='in'/> + <arg type='s' name='format' direction='in'/> + <arg type='b' name='success' direction='out'/> + <arg type='s' name='message' direction='out'/> + </method> + <method name='check_write'> + <arg type='s' name='target' direction='in'/> + <arg type='s' name='source' direction='in'/> + </method> + <method name='end'> + <arg type='b' name='success' direction='out'/> + <arg type='s' name='message' direction='out'/> + </method> + <property name="done" type="b" access="read"/> + <property name="progress" type="i" access="read"/> + <property name="message" type="s" access="read"/> + <property name="state" type="b" access="read"/> + </interface> + </node> + """ + def __init__(self): + super().__init__() + self.finished = threading.Event() + self._progress = 0 + self.loop = GLib.MainLoop() + self.return_state = False + self.return_message = "" + self.authorized_sender_read = set() + self.authorized_sender_write = set() + + def do_write(self,source, target): + print("Writing") + self.finished.clear() + self.thread = threading.Thread(target=self._do_write, args=(source, target, )) + self.thread.start() + + @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): + 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): + print("Unmounting") + return self._do_unmount([device]) + + def check_write(self,target, source): + self.thread = threading.Thread(target=self._check_write, args=(target, source,)) + self.thread.start() + + def run(self): + self.loop.run() + + def check_permission_write(self, sender): + """ Check for senders permission to update system packages""" + if sender in self.authorized_sender_write: + return + else: + if self._check_permission(sender, 'org.baseurl.DnfSystem.write'): + self.authorized_sender_write.add(sender) + + def _check_permission(self, sender, action): + """ Check senders permissions using PolicyKit1 + """ + if not sender: + raise ValueError('sender == None') + + obj = SystemBus().get( + 'org.freedesktop.PolicyKit1', + '/org/freedesktop/PolicyKit1/Authority') + iface = obj['org.freedesktop.PolicyKit1.Authority'] + (granted, _, details) = iface.CheckAuthorization( + ('system-bus-name', {'name': sender}), action, {}, + 1, '', timeout=600) + if not granted: + return False + else: + return True + + +class ConfFile(object): + """ + <node> + <interface name='org.mageia.Magiback'> + <method name='setName'> + <arg type='s' name='a' direction='in'/> + </method> + <method name='getFile'> + <arg type='s' name='content' direction='out'/> + </method> + <method name='saveFile'> + <arg type='s' name='content' direction='in'/> + </method> + </interface> + </node> + """ + 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): + 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() |