source: lliurex-moving-core/trunk/fuentes/bin/llx-moving-gnome @ 714

Last change on this file since 714 was 714, checked in by jrpelegrina, 4 years ago

First release to xenial

  • Property svn:executable set to *
File size: 6.2 KB
Line 
1#!/usr/bin/python
2
3import os
4import time
5import atexit
6import syslog
7import dbus
8from dbus.mainloop.glib import DBusGMainLoop
9
10from gi.repository import Gtk,GObject,Gio
11import time
12
13import subprocess
14
15import net.Lliurex.Classroom.MovingProfiles
16import xmlrpclib
17
18
19def get_ticks():
20        millis = int(round(time.time() * 1000))
21        return millis
22       
23FD=None
24
25def get_ticks():
26        millis = int(round(time.time() * 1000))
27        return millis
28       
29def login1ManagerDBusIface():
30        # ###########################
31        #CONNECT TO DBUS  SHUTDOWN OR REBOOT SIGNAL
32        # ###########################
33        system_bus = dbus.SystemBus()
34        proxy = system_bus.get_object( 'org.freedesktop.login1','/org/freedesktop/login1' )
35        login1 = dbus.Interface( proxy, 'org.freedesktop.login1.Manager')
36        return login1
37
38#def
39
40def sleepShutdownInhibit():
41        # ###########################
42        #INHIBIT  SHUTDOWN OR REBOOT SIGNAL
43        # ###########################
44        login1 = login1ManagerDBusIface()
45        print "INHIBIT IS COMING................."
46        fd = login1.Inhibit( 'shutdown:sleep', 'Moving Profile', 'Saving your files...','delay' )
47        print "Inhibit has been  done well..........."
48        print "Inhibit is: %s" %fd
49        list=login1.ListInhibitors()
50        print "###############################"
51        print "LIST OF INHIBITORS IS:"
52        print "###############################"
53        print "%s" %list
54        return fd
55
56#def
57
58def take_lock():
59        global FD
60        print "LOCK IS DONE......"
61        FD = sleepShutdownInhibit()
62        print "Inhibit FD is: %s" %FD
63#def
64
65def remove_lock():
66        # ###########################
67        #LIBERAMOS LA SENYAL CERRANDO EL FICHERO
68        # ###########################
69        global FD
70        if FD:
71                print "REMOVE LOCK NOW............."
72                print "CLOSING FD is: %s" %FD
73                os.close( FD.take() )
74                FD = None
75#def
76
77class Service:
78       
79       
80        def __init__(self):
81                syslog.syslog("init")
82               
83               
84                self.server_name="server"
85
86                DBusGMainLoop(set_as_default=True)
87               
88                #BLOQUEAMOS LA SENYAL DE SHUTDOWN CON UN DELAY, PARA QUE ESPERE HA HACER EL SCRIPT CON UN TIEMPO MAXIMO DEFINIDO EN /etc/systemd/logind.conf
89                try:
90                        take_lock()
91                        atexit.register(remove_lock)
92                       
93                except Exception as e:
94                        syslog.syslog(e.message)
95                               
96                self.session_bus = dbus.SessionBus()
97               
98                # ###########################
99                #CAPTURE SHUTDOWN OR REBOOT SIGNAL
100                # ###########################
101                try:
102                        proxy2=login1ManagerDBusIface()
103                        proxy2.connect_to_signal("PrepareForShutdown",self.on_shutdown)
104                       
105                except Exception as e:
106                        syslog.syslog(e.message)
107               
108                # ###########################
109                #CAPTURE END SESSION SIGNAL
110                # ###########################
111                proxy = self.session_bus.get_object('org.gnome.SessionManager','/org/gnome/SessionManager')
112                proxy=dbus.Interface(proxy,"org.gnome.SessionManager")
113                syslog.syslog("registering...")
114                d_id=os.getenv("DESKTOP_AUTOSTART_ID")
115                if d_id==None:
116                        d_id="llx-moving-gnome"
117                       
118                self.client_id=proxy.RegisterClient("llx-moving-gnome",d_id)
119               
120                syslog.syslog("Autostart ID "+str(d_id))
121                syslog.syslog("Client ID "+str(self.client_id))
122                               
123                proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id)
124                proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate")
125               
126                proxy.connect_to_signal("QueryEndSession",self.on_query_end_session)
127                proxy.connect_to_signal("EndSession",self.on_end_session)
128               
129               
130                self.mp = net.Lliurex.Classroom.MovingProfiles.MovingProfiles("")
131               
132                try:
133                        t1=get_ticks()
134                        self.mp.LoadSession()
135                        t2=get_ticks()
136                        self.load_dconf()
137                        t3=get_ticks()
138                       
139                        syslog.syslog("profile load time:"+str(t2-t1)+" ms")
140                        syslog.syslog("dconf load time:"+str(t3-t2)+" ms")
141                       
142                except Exception as e:
143                        syslog.syslog(e.message)
144               
145               
146        #def
147       
148       
149        def on_shutdown(self,sender):
150                print "####################################"
151                print "SIGNAL SHUTDOWN CAPTURED..........."
152                print "####################################"
153               
154                self.on_end_session(None)
155                print "Session saved with moving profiles"
156                syslog.syslog("Session saved with moving profiles in shutdown or reboot")
157                print"------------------------------------"
158                print "3 seconds to shutdown......"
159                time.sleep(1)
160                print "2 seconds to shutdown......"
161                time.sleep(1)
162                print "1 seconds to shutdown......"
163                time.sleep(1)
164                print "SHUTDOWN......bye"
165                time.sleep(1)
166                remove_lock()
167               
168        #def
169
170        def on_query_end_session(self,sender):
171                syslog.syslog("logout query")
172                proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id)
173                proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate")
174                proxy.EndSessionResponse(True,"saving session...")
175               
176        #def
177       
178       
179        def on_end_session(self,sender):
180                syslog.syslog("logout")
181               
182                try:
183                        t1=get_ticks()
184                        self.mp.SaveSession()
185                        t2=get_ticks()
186                        self.save_dconf()
187                        t3=get_ticks()
188                       
189                        syslog.syslog("profile save time:"+str(t2-t1)+" ms")
190                        syslog.syslog("dconf save time:"+str(t3-t2)+" ms")
191                       
192                except Exception as e:
193                        syslog.syslog(e.message)
194       
195               
196       
197                syslog.syslog("logout response")
198                proxy = self.session_bus.get_object('org.gnome.SessionManager',self.client_id)
199                proxy=dbus.Interface(proxy,"org.gnome.SessionManager.ClientPrivate")
200                proxy.EndSessionResponse(True,"unregistering")
201               
202               
203                syslog.syslog("terminating")
204                Gtk.main_quit()
205        #def
206
207        def load_dconf(self):
208                syslog.syslog("loading dconf")
209                dump_file = self.mp.GetProfilePath()+"/../.dconf.dump"
210                if os.path.exists(dump_file):
211                        p=subprocess.Popen(["dconf","reset","-f","/"])
212                        p.communicate()
213                       
214                        of = open(dump_file)
215                        data = of.read()
216                        of.close()
217                       
218                        p=subprocess.Popen(["dconf","load","/"],stdin=subprocess.PIPE)
219                        p.communicate(data)
220                       
221                        p=subprocess.Popen(["dconf","update","/"],stdin=subprocess.PIPE)
222                        p.communicate(data)
223                       
224                        c=xmlrpclib.ServerProxy("https://%s:9779"%(self.server_name))
225                        try:
226                                if c.is_frozen_user("","Golem",os.getenv("USER")):
227                                        os.system("dconf reset -f /")
228                        except Exception as e:
229                                syslog.syslog(e.message)
230                       
231                               
232                        Gio.Settings.sync()
233                else:
234                        syslog.syslog("no dconf dump found")
235               
236        #def
237       
238        def save_dconf(self):
239                syslog.syslog("dumping dconf data")
240                p=subprocess.Popen(["dconf","dump","/"],stdout=subprocess.PIPE)
241                stdout,stderr=p.communicate()
242               
243                of = open(self.mp.GetProfilePath()+"/../.dconf.dump","w")
244                of.write(stdout)
245                of.close()     
246        #def
247       
248
249if __name__=="__main__":
250
251        uid=os.getuid()
252       
253        if(uid<5000):
254                syslog.syslog("local user {0}, not using moving profiles".format(uid))
255        else:
256                ms = Service()
257                Gtk.main()
258                syslog.syslog("bye")
259       
260       
261       
Note: See TracBrowser for help on using the repository browser.