diff options
author | Papoteur <papoteur@mageia.org> | 2018-03-11 13:54:12 +0100 |
---|---|---|
committer | Papoteur <papoteur@mageia.org> | 2018-03-16 11:17:42 +0100 |
commit | 2ac71badfd671cd397ac23c92be58ff2090bac21 (patch) | |
tree | 171d895cb3dd0a06c8cd88096c9814fb9c095b1b /backend/magiback | |
parent | cf47ed2aa96097466370456eeb66709370707cb8 (diff) | |
download | isodumper-2ac71badfd671cd397ac23c92be58ff2090bac21.tar isodumper-2ac71badfd671cd397ac23c92be58ff2090bac21.tar.gz isodumper-2ac71badfd671cd397ac23c92be58ff2090bac21.tar.bz2 isodumper-2ac71badfd671cd397ac23c92be58ff2090bac21.tar.xz isodumper-2ac71badfd671cd397ac23c92be58ff2090bac21.zip |
Add backend providing DBus service
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() |