#!/usr/bin/env python3
# -*- coding: utf-8 -*
import os
import xmlrpc.client as n4d
import ssl
import gi
gi.require_version('Gtk','3.0')
gi.require_version('PangoCairo','1.0')
from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
import threading
import sys
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
import gettext
gettext.textdomain('lliurex-openmeetings-remote')
_ = gettext.gettext
class LORemoteStartup:
def __init__(self,ip=None):
self.ip=ip
if self.ip==None:
self.ip="server"
self.thread=threading.Thread()
self.force_state=True
self.start_gui()
#def init
def start_gui(self):
builder=Gtk.Builder()
builder.set_translation_domain("lliurex-openmeetings-remote")
#glade_path="/srv/svn/trusty/lliurex-openmeetings/trunk/fuentes/client-install-files/usr/share/lliurex-openmeetings-remote/rsrc/lliurex-openmeetings-remote-startup.glade"
glade_path="/usr/share/lliurex-openmeetings-remote/rsrc/lliurex-openmeetings-remote-startup.glade"
builder.add_from_file(glade_path)
self.window=builder.get_object("window1")
self.status_label=builder.get_object("status_label")
self.status_switch=builder.get_object("status_switch")
self.image=builder.get_object("image")
self.login_window=builder.get_object("login_window")
self.user_entry=builder.get_object("user_entry")
self.pwd_entry=builder.get_object("pwd_entry")
self.accept_button=builder.get_object("accept_button")
self.cancel_button=builder.get_object("cancel_button")
self.login_label=builder.get_object("login_label")
self.progress_window=builder.get_object("progress_window")
self.progressbar=builder.get_object("progressbar")
self.window.connect("destroy",Gtk.main_quit)
self.login_window.connect("destroy",Gtk.main_quit)
self.accept_button.connect("clicked",self.accept_clicked)
self.cancel_button.connect("clicked",Gtk.main_quit)
self.status_switch.connect("notify::active",self.status_changed)
self.pwd_entry.connect("activate",self.accept_clicked)
self.login_window.show()
Gtk.main()
#def start_gui
def accept_clicked(self,widget):
context=ssl._create_unverified_context()
client = n4d.ServerProxy("https://%s:9779"%self.ip,context=context,allow_none=True)
# client=xmlrpclib.ServerProxy("https://%s:9779"%self.ip)
user=self.user_entry.get_text()
password=self.pwd_entry.get_text()
ret=client.validate_user(user,password)
if ret[0]:
letsgo=False
for group in ["adm","admins","teachers"]:
if group in ret[1]:
letsgo=True
break
if letsgo:
self.login_window.hide()
self.user_info=(user,password)
client = n4d.ServerProxy("https://%s:9779"%self.ip,context=context,allow_none=True)
# client=xmlrpclib.ServerProxy("https://%s:9779"%self.ip)
ret=client.remote_service_is_running(self.user_info,"LliurexOpenmeetings")
if ret[1]==-1:
self.open_dialog("Lliurex Lab",_("Lliurex Lab service is not initialized"))
sys.exit(0)
self.service_status=ret[0]
self.status_switch.set_active(self.service_status)
if self.service_status:
self.status_label.set_text(_("Lliurex Lab service is running"))
self.image.set_from_icon_name("user-available",Gtk.IconSize.BUTTON)
else:
self.status_label.set_text(_("Lliurex Lab service is stopped"))
self.image.set_from_icon_name("user-busy",Gtk.IconSize.BUTTON)
self.force_state=False
self.window.show()
else:
self.login_label.set_markup(""+_("User is not allowed to use this application")+"")
else:
self.login_label.set_markup(""+_("User or password not valid")+"")
#def accept_clicked
def status_changed(self,widget,state):
if not self.force_state:
widget.get_active()
self.progress_window.show()
GLib.timeout_add(50,self.pulsating)
self.thread=threading.Thread(target=self.enable_service,args=(widget.get_active(),))
self.thread.daemon=True
self.thread.start()
else:
self.force_state=False
#def status_changed
def enable_service(self,state):
context=ssl._create_unverified_context()
c = n4d.ServerProxy("https://%s:9779"%self.ip,context=context,allow_none=True)
#c=xmlrpclib.ServerProxy("https://%s:9779"%self.ip)
if state:
c.remote_service_start(self.user_info,"LliurexOpenmeetings")
self.service_status=True
else:
c.remote_service_stop(self.user_info,"LliurexOpenmeetings")[0]
self.service_status=False
#def enable_service
def pulsating(self):
self.progressbar.pulse()
if not self.thread.is_alive():
self.progress_window.hide()
if self.service_status:
self.status_label.set_text(_("Lliurex Lab service is running"))
self.image.set_from_icon_name("user-available",Gtk.IconSize.BUTTON)
else:
self.status_label.set_text(_("Lliurex Lab service is stopped"))
self.image.set_from_icon_name("user-busy",Gtk.IconSize.BUTTON)
return self.thread.is_alive()
def open_dialog(self,title,text,show_cancel=False):
label = Gtk.Label()
label.set_markup(text)
if show_cancel:
dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT,Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL))
else:
dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
hbox = Gtk.HBox()
img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
hbox.pack_start(img,True,True,5)
hbox.pack_start(label,True,True,10)
hbox.show_all()
dialog.vbox.pack_start(hbox,True,True,10)
dialog.set_border_width(6)
response = dialog.run()
dialog.destroy()
return response
#def open_dialog
#class LORemoteStartup
if __name__=="__main__":
lo=LORemoteStartup()