#!/usr/bin/env python import os import time import syslog import dbus from dbus.mainloop.glib import DBusGMainLoop from gi.repository import Gtk,GObject,Gio import time import subprocess import net.Lliurex.Classroom.MovingProfiles import xmlrpclib class Service: def __init__(self): syslog.syslog("init") DBusGMainLoop(set_as_default=True) self.session_bus = dbus.SessionBus() proxy = self.session_bus.get_object('org.gnome.SessionManager','/org/gnome/SessionManager') proxy=dbus.Interface(proxy,"org.gnome.SessionManager") syslog.syslog("registering...") d_id=os.getenv("DESKTOP_AUTOSTART_ID") if d_id==None: d_id="lliurex-moving-gnome" self.client_id=proxy.RegisterClient("lliurex-moving-gnome",d_id) syslog.syslog("Autostart ID "+str(d_id)) syslog.syslog("Client ID "+str(self.client_id)) proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id) proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate") proxy.connect_to_signal("QueryEndSession",self.on_query_end_session) proxy.connect_to_signal("EndSession",self.on_end_session) self.mp = net.Lliurex.Classroom.MovingProfiles.MovingProfiles("") try: self.mp.LoadSession() self.load_dconf() except Exception as e: syslog.syslog(e.message) #def def on_query_end_session(self,sender): syslog.syslog("logout query") proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id) proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate") proxy.EndSessionResponse(True,"saving session...") #def def on_end_session(self,sender): syslog.syslog("logout") self.mp.SaveSession() self.save_dconf() #unregistering #syslog.syslog("unregistering") #proxy = self.session_bus.get_object('org.gnome.SessionManager','/org/gnome/SessionManager/UnregisterClient') #proxy(self.client_id) syslog.syslog("logout response") proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id) proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate") proxy.EndSessionResponse(True,"unregistering") syslog.syslog("terminating") Gtk.main_quit() #def def load_dconf(self): syslog.syslog("loading dconf") dump_file = self.mp.GetProfilePath()+"/../.dconf.dump" if os.path.exists(dump_file): p=subprocess.Popen(["dconf","reset","/"]) p.communicate() of = open(dump_file) data = of.read() of.close() p=subprocess.Popen(["dconf","load","/"],stdin=subprocess.PIPE) p.communicate(data) c=xmlrpclib.ServerProxy("https://server:9779") try: if c.is_frozen_user("","Golem",os.getenv("USER")): os.system("dconf reset -f /") except Exception as e: pass Gio.Settings.sync() else: syslog.syslog("no dconf dump found") #def def save_dconf(self): syslog.syslog("dumping dconf data") p=subprocess.Popen(["dconf","dump","/"],stdout=subprocess.PIPE) stdout,stderr=p.communicate() of = open(self.mp.GetProfilePath()+"/../.dconf.dump","w") of.write(stdout) of.close() #def if __name__=="__main__": ms = Service() Gtk.main() syslog.syslog("bye")