source: zero-lliurex-mirror-redirect/trunk/fuentes/zero-lliurex-mirror-redirect.install/usr/sbin/mirror-redirect.py @ 7514

Last change on this file since 7514 was 7514, checked in by Juanma, 17 months ago

update gui

  • Property svn:executable set to *
File size: 7.6 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, GObject, Gdk
6import shutil
7import os
8import subprocess
9import time
10import threading
11import sys
12import xmlrpclib as n4d
13import lliurex.interfacesparser
14from edupals.ui.n4dgtklogin import *
15import gettext
16gettext.textdomain('zero-lliurex-mirror-redirect')
17_ = gettext.gettext
18
19class redirectMirror(threading.Thread):
20        def __init__(self,callback):
21                threading.Thread.__init__(self)
22                self.dbg=9
23                self.sw_slave=False
24                self.master_ip=''
25                self.callback=callback
26                self.hostFile="/var/lib/dnsmasq/hosts/mirror"
27                self.cnameFile="/var/lib/dnsmasq/config/cname-mirror"
28                self.mirror_dir="/net/mirror/llx16"
29                self.slave_ip=''
30                self.master_ip='10.3.0.254'
31                self.n4d=self._n4d_connect("localhost")
32                self._set_server_data()
33                self.n4dMaster=self._n4d_connect(self.master_ip)
34                self.credentials=[]
35        #def __init__
36
37        def _debug(self,msg):
38                if self.dbg==1:
39                        print("DBG: "+str(msg))
40        #def _debug
41
42        def _n4d_connect(self,server):
43                n4dclient=n4d.ServerProxy("https://"+server+":9779")
44                return(n4dclient)
45
46        def set_credentials(self,credentials):
47                self.credentials=credentials
48
49        def _set_server_data(self):
50                self.master_ip=self.n4d.get_variable("","VariablesManager","MASTER_SERVER_IP")
51                if (self.master_ip):
52                        self.sw_slave=True
53                else:
54                        self.master_ip=self.n4d.get_variable("","VariablesManager","SRV_IP")
55        #def _set_server_data
56
57        def is_enabled(self):
58                sw_enabled=False
59                self.slave_ip=self._get_replication_ip()
60                try:
61                        sw_enabled=self.n4dMaster.is_mirror_shared("","NfsManager","/net/mirror/llx16",self.slave_ip)['status']
62                except:
63                        sw_enabled=False
64                return(sw_enabled)
65        #def is_enabled
66
67        def enable_redirect(self):
68                sw_add=False
69                if not os.path.isdir(self.mirror_dir):
70                        try:
71                                os.makedirs(self.mirror_dir)
72                        except:
73                                self._debug("Can't create dir %s"%self.mirror_dir)
74               
75                try:
76                        sw_add=self.n4dMaster.add_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
77                        if not self.n4d.is_mount_configured(self.credentials,"NfsManager",self.mirror_dir)['status']:
78                                self.n4d.configure_mount_on_boot(self.credentials,"NfsManager",self.master_ip+":"+self.mirror_dir,self.mirror_dir)
79                                self._debug("Mounting on boot")
80                except Exception as e:
81                        print(e)
82                        sw_add=False
83                GObject.idle_add(self.callback,sw_add)
84                return sw_add
85        #def enable_redirect
86
87        def disable_redirect(self):
88                try:
89                        self.n4d.remove_mount_on_boot(self.credentials,"NfsManager",self.mirror_dir)
90                        sw_rm=self.n4dMaster.remove_ip_from_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
91                except:
92                        sw_rm=False
93                GObject.idle_add(self.callback,1)
94                return sw_rm
95        #def disable_redirect
96
97        def _get_replication_ip(self):
98                ifaces=lliurex.interfacesparser.InterfacesParser()
99                ifaces.load('/etc/network/interfaces')
100                iface=''
101                for aux_iface in ifaces.get_interfaces_in_range("10.3.0.0/24"):
102                        iface=aux_iface
103                        break
104                ip=ifaces.get_info_interface(iface)[1].split('\n')[1].split(' ')[-1]
105                return ip
106        #def _get_replication_ip
107
108class mainWindow(Gtk.Window):
109        def __init__(self):
110                self.redirectMirror=redirectMirror(self._callback)
111                if not self.redirectMirror.sw_slave:
112                        print("[!] You need to be on a slave server to run this program [!]")
113                        label = Gtk.Label(_("You need to be on a slave server to run mirror-redirect"))
114                        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
115                        dialog.vbox.pack_start(label,True,True,10)
116                        label.show()
117                        dialog.set_border_width(6)
118                        response = dialog.run()
119                        dialog.destroy()
120                        sys.exit(0)
121
122                self.dbg=False
123                Gtk.Window.__init__(self,title=_("Mirror Redirect"))
124                self.set_resizable(False)
125                self.stack=Gtk.Stack()
126                self.stack.set_transition_duration(1000)
127                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
128                form_grid=Gtk.Grid()
129                form_grid.set_valign(Gtk.Align.START)
130                form_grid.set_halign(Gtk.Align.CENTER)
131                form_grid.set_column_homogeneous(False)
132                form_grid.set_row_homogeneous(False)
133                form_grid.set_margin_right(0)
134                login=N4dGtkLogin()
135                desc=_("From here you can redirect the mirror in a slave server to the master server's own mirror")
136                login.set_info_text("<span foreground='black'>Mirror Redirect</span>",_("Redirect mirror"),"<span foreground='black'>"+desc+"</span>")
137                login.set_info_background(image='/usr/share/mirror-redirect/rsrc/redirect.svg',cover=True)
138                login.set_allowed_groups(['adm'])
139                login.after_validation_goto(self._signin)
140                login.set_mw_proportion_ratio(2,1)
141                img_banner=Gtk.Image()
142                img_banner.set_from_file('/usr/share/mirror-redirect/rsrc/redirect_banner.png')
143                form_grid.attach(img_banner,0,0,2,1)
144                lbl_switch=Gtk.Label(_("Enable mirror redirection"))
145                lbl_switch.set_halign(Gtk.Align.END)
146                form_grid.attach(lbl_switch,0,2,1,1)
147                self.sw_enable=Gtk.Switch()
148                self.sw_enable.set_halign(Gtk.Align.START)
149                form_grid.attach(self.sw_enable,1,2,1,1)
150                self.lbl_state=Gtk.Label('')
151                self.lbl_state.set_width_chars(30)
152                self.lbl_state.set_halign(Gtk.Align.CENTER)
153                self.lbl_state.set_valign(Gtk.Align.START)
154                self.lbl_state.set_xalign(0)
155                self.lbl_state.modify_fg(Gtk.StateType.NORMAL,Gdk.color_parse('#888'))
156                form_grid.attach(self.lbl_state,0,3,2,1)
157                self.spinner = Gtk.Spinner()
158                form_grid.attach(self.spinner,0,1,2,3)
159                self.sw_enable.set_active(self.redirectMirror.is_enabled())
160                if self.sw_enable.get_state():
161                        service_label=_("Using master server mirror")
162                else:
163                        service_label=_("Using local mirror")
164                self.lbl_state.set_text(_(service_label))
165                self.sw_enable.connect("state-set",self._on_sw_state)
166               
167                self.stack.add_titled(login, "login", "Login")
168                self.stack.add_titled(form_grid, "gui", "Gui")
169                self.stack.set_visible_child_name("login")
170                self.add(self.stack)
171                self.set_position(Gtk.WindowPosition.CENTER)
172                self.connect("delete-event", Gtk.main_quit)
173
174                self.show_all()
175        #def __init__
176                               
177        def _signin(self,user,pwd,server):
178                self.credentials=[user,pwd]
179                self.redirectMirror.set_credentials(self.credentials)
180                self.stack.set_visible_child_name("gui")
181
182        def _debug(self,msg):
183                if self.dbg==1:
184                        print("DBG: "+str(msg))
185        #def _debug
186
187        def _on_sw_state(self,widget,data):
188                self._debug("State changed")
189                widget.set_sensitive(False)
190                self.spinner.start()
191                sw_state=widget.get_state()
192                if not sw_state:
193                        self._debug("Redirecting mirror...")
194                        self.lbl_state.set_text(_("Redirecting mirror..."))
195                        th=threading.Thread(target=self.redirectMirror.enable_redirect)
196                        th.start()
197                else:
198                        self.lbl_state.set_text(_("Redirecting mirror..."))
199                        th=threading.Thread(target=self.redirectMirror.disable_redirect)
200                        th.start()
201                self._debug("Done")
202        #def _on_sw_state
203
204        def _callback(self,action=None):
205                self.spinner.stop()
206                if action:
207                        self.lbl_state.set_text(_("Using master server mirror"))
208                else:
209                        self.lbl_state.set_text(_("Using local mirror"))
210                        self.sw_enable.handler_block_by_func(self._on_sw_state)
211                        self.sw_enable.set_state(False)
212                        self.sw_enable.handler_unblock_by_func(self._on_sw_state)
213                self.sw_enable.set_sensitive(True)
214        #def _callback
215
216def read_key():
217        try:
218                f=open("/etc/n4d/key")
219                f.close()
220                #hack
221                return True
222        except:
223                return False
224
225status=read_key()
226status=True
227
228if not status:
229        print("[!] You need root privileges to run this program [!]")
230        label = Gtk.Label(_("You need root privileges to run mirror-redirect"))
231        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
232        dialog.vbox.pack_start(label,True,True,10)
233        label.show()
234        dialog.set_border_width(6)
235        response = dialog.run()
236        dialog.destroy()
237#       sys.exit(0)
238
239GObject.threads_init()
240Gdk.threads_init()
241win = mainWindow()
242Gtk.main()
Note: See TracBrowser for help on using the repository browser.