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

Last change on this file since 6400 was 6400, checked in by Juanma, 3 years ago

gui revised

  • Property svn:executable set to *
File size: 7.7 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
36        #def __init__
37
38        def _debug(self,msg):
39                if self.dbg==1:
40                        print("DBG: "+str(msg))
41        #def _debug
42
43        def _n4d_connect(self,server):
44                n4dclient=n4d.ServerProxy("https://"+server+":9779")
45                return(n4dclient)
46
47        def set_credentials(self,credentials):
48                self.credentials=credentials
49
50        def _set_server_data(self):
51                self.master_ip=self.n4d.get_variable("","VariablesManager","MASTER_SERVER_IP")
52                if (self.master_ip):
53                        self.sw_slave=True
54                else:
55                        self.master_ip=self.n4d.get_variable("","VariablesManager","SRV_IP")
56        #def _set_server_data
57
58        def is_enabled(self):
59                sw_enabled=False
60                self.slave_ip=self._get_replication_ip()
61                try:
62                        sw_enabled=self.n4dMaster.is_mirror_shared("","NfsManager","/net/mirror/llx16",self.slave_ip)['status']
63                except:
64                        sw_enabled=False
65                return(sw_enabled)
66        #def is_enabled
67
68        def enable_redirect(self):
69                sw_add=False
70                if not os.path.isdir(self.mirror_dir):
71                        try:
72                                os.makedirs(self.mirror_dir)
73                        except:
74                                self._debug("Can't create dir %s"%self.mirror_dir)
75               
76                try:
77                        sw_add=self.n4dMaster.add_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
78                        if not self.n4d.is_mount_configured(self.credentials,"NfsManager",self.mirror_dir)['status']:
79                                self.n4d.configure_mount_on_boot(self.credentials,"NfsManager",self.master_ip+":"+self.mirror_dir,self.mirror_dir)
80                                self._debug("Mounting on boot")
81                except Exception as e:
82                        print(e)
83                        sw_add=False
84                GObject.idle_add(self.callback,sw_add)
85                return sw_add
86        #def enable_redirect
87
88        def disable_redirect(self):
89                try:
90                        self.n4d.remove_mount_on_boot(self.credentials,"NfsManager",self.mirror_dir)
91                        sw_rm=self.n4dMaster.remove_ip_from_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
92                except:
93                        sw_rm=False
94                GObject.idle_add(self.callback,1)
95                return sw_rm
96        #def disable_redirect
97
98        def _get_replication_ip(self):
99                ifaces=lliurex.interfacesparser.InterfacesParser()
100                ifaces.load('/etc/network/interfaces')
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=1
123                Gtk.Window.__init__(self,title=_("Mirror Redirect"))
124                self.stack=Gtk.Stack()
125                self.stack.set_transition_duration(1000)
126                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
127                form_grid=Gtk.Grid()
128                form_grid.set_valign(Gtk.Align.START)
129                form_grid.set_halign(Gtk.Align.CENTER)
130                form_grid.set_column_homogeneous(False)
131                form_grid.set_row_homogeneous(False)
132                login=N4dGtkLogin()
133                desc=_('Desde aquí puedes redireccionar el mirror en un servidor esclavo para usar el del servidor maestro')
134                login.set_info_text("<span foreground='black'>Mirror Redirect</span>",_("Redireccionar el mirror"),"<span foreground='black'>"+desc+"</span>")
135                login.set_info_background(image='mirror-redirect',cover=True)
136                login.set_allowed_groups(['adm'])
137                login.after_validation_goto(self._signin)
138                img_banner=Gtk.Image()
139                img_banner.set_from_file('/usr/share/icons/hicolor/scalable/apps/mirror-redirect.svg')
140                form_grid.attach(img_banner,0,0,1,3)
141                lbl_header=Gtk.Label()
142                lbl_header.set_valign(Gtk.Align.START)
143                lbl_header.set_halign(Gtk.Align.CENTER)
144                lbl_header.set_margin_top(12)
145                lbl_header.set_markup('<big><b>Lliurex mirror redirect</b></big>')
146                form_grid.attach(lbl_header,1,0,2,3)
147                lbl_switch=Gtk.Label(_("Enable mirror redirection"))
148                lbl_switch.set_halign(Gtk.Align.START)
149                form_grid.attach(lbl_switch,1,1,1,1)
150                self.sw_enable=Gtk.Switch()
151                self.sw_enable.set_halign(Gtk.Align.START)
152                form_grid.attach(self.sw_enable,2,1,1,1)
153                self.lbl_state=Gtk.Label('')
154                self.lbl_state.set_width_chars(30)
155                self.lbl_state.set_halign(Gtk.Align.START)
156                self.lbl_state.set_valign(Gtk.Align.START)
157                self.lbl_state.set_xalign(0)
158                self.lbl_state.modify_fg(Gtk.StateType.NORMAL,Gdk.color_parse('#888'))
159                form_grid.attach(self.lbl_state,1,2,2,1)
160                self.spinner = Gtk.Spinner()
161                form_grid.attach(self.spinner,0,0,3,3)
162                self.sw_enable.set_active(self.redirectMirror.is_enabled())
163                if self.sw_enable.get_state():
164                        service_label=_("Using master server mirror")
165                else:
166                        service_label=_("Using local mirror")
167                self.lbl_state.set_text(_(service_label))
168                self.sw_enable.connect("state-set",self._on_sw_state)
169               
170                self.stack.add_titled(login, "login", "Login")
171                self.stack.add_titled(form_grid, "gui", "Gui")
172                self.stack.set_visible_child_name("login")
173                self.add(self.stack)
174                self.set_position(Gtk.WindowPosition.CENTER)
175                self.connect("delete-event", Gtk.main_quit)
176
177                self.show_all()
178        #def __init__
179                               
180        def _signin(self,lm,user,pwd):
181                self.credentials=[user,pwd]
182                self.redirectMirror.set_credentials(self.credentials)
183                self.stack.set_visible_child_name("gui")
184
185        def _debug(self,msg):
186                if self.dbg==1:
187                        print("DBG: "+str(msg))
188        #def _debug
189
190        def _on_sw_state(self,widget,data):
191                self._debug("State changed")
192                widget.set_sensitive(False)
193                self.spinner.start()
194                sw_state=widget.get_state()
195                if not sw_state:
196                        self._debug("Redirecting mirror...")
197                        self.lbl_state.set_text(_("Redirecting mirror..."))
198                        th=threading.Thread(target=self.redirectMirror.enable_redirect)
199                        th.start()
200                else:
201                        self.lbl_state.set_text(_("Redirecting mirror..."))
202                        th=threading.Thread(target=self.redirectMirror.disable_redirect)
203                        th.start()
204                self._debug("Done")
205        #def _on_sw_state
206
207        def _callback(self,action=None):
208                self.spinner.stop()
209                if action:
210                        self.lbl_state.set_text(_("Using master server mirror"))
211                else:
212                        self.lbl_state.set_text(_("Using local mirror"))
213                        self.sw_enable.handler_block_by_func(self._on_sw_state)
214                        self.sw_enable.set_state(False)
215                        self.sw_enable.handler_unblock_by_func(self._on_sw_state)
216                self.sw_enable.set_sensitive(True)
217        #def _callback
218
219def read_key():
220        try:
221                f=open("/etc/n4d/key")
222                f.close()
223                #hack
224                return True
225        except:
226                return False
227
228status=read_key()
229status=True
230
231if not status:
232        print("[!] You need root privileges to run this program [!]")
233        label = Gtk.Label(_("You need root privileges to run mirror-redirect"))
234        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
235        dialog.vbox.pack_start(label,True,True,10)
236        label.show()
237        dialog.set_border_width(6)
238        response = dialog.run()
239        dialog.destroy()
240#       sys.exit(0)
241
242GObject.threads_init()
243Gdk.threads_init()
244win = mainWindow()
245Gtk.main()
Note: See TracBrowser for help on using the repository browser.