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

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

Changed to N4d's NfsManager?

  • Property svn:executable set to *
File size: 7.2 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=1
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                sw_enabled=self.n4dMaster.is_mirror_shared("","NfsManager","/net/mirror/llx16",self.slave_ip)['status']
62                return(sw_enabled)
63        #def is_enabled
64
65        def enable_redirect(self):
66                sw_add=False
67                if not os.path.isdir(self.mirror_dir):
68                        try:
69                                os.makedirs(self.mirror_dir)
70                        except:
71                                print("Can't create dir %s"%self.mirror_dir)
72               
73                try:
74                        sw_add=self.n4dMaster.add_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
75                        if not self.n4d.is_mount_configured(self.credentials,"NfsManager",self.mirror_dir)['status']:
76                                self.n4d.configure_mount_on_boot(self.credentials,"NfsManager",self.master_ip+":"+self.mirror_dir,self.mirror_dir)
77                                print("Mounting on boot")
78                except Exception as e:
79                        print(e)
80                        sw_add=False
81                GObject.idle_add(self.callback,1)
82                return sw_add
83        #def enable_redirect
84
85        def disable_redirect(self):
86                try:
87                        self.n4d.remove_mount_on_boot(self.credentials,"NfsManager",self.mirror_dir)
88                        sw_rm=self.n4dMaster.remove_ip_from_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
89                except:
90                        sw_rm=False
91                GObject.idle_add(self.callback,1)
92                return sw_rm
93        #def disable_redirect
94
95        def _get_replication_ip(self):
96                ifaces=lliurex.interfacesparser.InterfacesParser()
97                ifaces.load('/etc/network/interfaces')
98                for aux_iface in ifaces.get_interfaces_in_range("10.3.0.0/24"):
99                        iface=aux_iface
100                        break
101                ip=ifaces.get_info_interface(iface)[1].split('\n')[1].split(' ')[-1]
102                return ip
103        #def _get_replication_ip
104
105class mainWindow(Gtk.Window):
106        def __init__(self):
107                self.redirectMirror=redirectMirror(self._callback)
108                if not self.redirectMirror.sw_slave:
109                        print("[!] You need to be on a slave server to run this program [!]")
110                        label = Gtk.Label(_("You need to be on a slave server to run mirror-redirect"))
111                        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
112                        dialog.vbox.pack_start(label,True,True,10)
113                        label.show()
114                        dialog.set_border_width(6)
115                        response = dialog.run()
116                        dialog.destroy()
117                        sys.exit(0)
118
119                self.dbg=1
120                Gtk.Window.__init__(self,title=_("Mirror Redirect"))
121                self.stack=Gtk.Stack()
122                self.stack.set_transition_duration(1000)
123                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
124                self.set_position(Gtk.WindowPosition.CENTER)
125                self.connect("delete-event", Gtk.main_quit)
126                vbox=Gtk.VBox()
127                img_area=Gtk.Box(spacing=6)
128                img=Gtk.Image(stock=Gtk.STOCK_REVERT_TO_SAVED)
129                img_area.add(img)
130                img_area.add(Gtk.Label(_("Mirror redirect")))
131                img_area.set_border_width(5)
132                img_area.show_all()
133                frame=Gtk.Frame()
134                frame.set_border_width(5)
135                box = Gtk.Grid()
136                box.set_border_width(5)
137                box.set_column_spacing(20)
138                box.set_row_spacing(30)
139                login=N4dGtkLogin()
140                login.set_info_text("<span foreground='black'>Mirror Redirect</span>","Redireccionar el mirror","<span foreground='black'>Desde aquí puedes redireccionar el mirror en un servidor esclavo para usar el del servidor maestro.</span>")
141                login.set_info_background(image='/usr/share/backgrounds/lliurex/lliurex-blueprint.png',cover=True)
142                login.after_validation_goto(self._signin)
143                loginBox=login.render_form()
144                self.stack.add_titled(loginBox, "login", "Login")
145                self.stack.add_titled(vbox, "gui", "Gui")
146                self.add(self.stack)
147                vbox.set_valign(Gtk.Align.CENTER)
148                vbox.set_halign(Gtk.Align.CENTER)
149                vbox.add(img_area)
150                vbox.add(frame)
151                frame.add(box)
152                box.attach(Gtk.Label(_("Enable Mirror Redirect")),0,1,1,1)
153                self.sw_Enable=Gtk.Switch()
154                box.attach(self.sw_Enable,1,1,1,1)
155                self.lbl_State=Gtk.Label('')
156                box.attach(self.lbl_State,0,2, 3,2)
157                self.spinner = Gtk.Spinner()
158                box.attach(self.spinner, 0, 3, 2, 2)
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                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
167                self.stack.set_visible_child_name("login")
168
169                self.show_all()
170        #def __init__
171                               
172        def _signin(self,lm,user,pwd):
173                self.credentials=[user,pwd]
174                self.redirectMirror.set_credentials(self.credentials)
175                self.stack.set_visible_child_name("gui")
176
177        def _debug(self,msg):
178                if self.dbg==1:
179                        print("DBG: "+str(msg))
180        #def _debug
181
182        def _on_sw_state(self,widget,data):
183                self._debug("State changed")
184                widget.set_sensitive(False)
185                self.spinner.start()
186                sw_state=widget.get_state()
187                if not sw_state:
188                        self._debug("Redirecting mirror...")
189                        self.lbl_State.set_text(_("Redirecting mirror..."))
190                        th=threading.Thread(target=self.redirectMirror.enable_redirect)
191                        th.start()
192                else:
193                        self.lbl_State.set_text(_("Redirecting mirror..."))
194                        th=threading.Thread(target=self.redirectMirror.disable_redirect)
195                        th.start()
196                self._debug("Done")
197        #def _on_sw_state
198
199        def _callback(self,action=None):
200                self.spinner.stop()
201                if action:
202                        self.lbl_State.set_text(_("Using master server mirror"))
203                else:
204                        self.lbl_State.set_text(_("Using local mirror"))
205                self.sw_Enable.set_sensitive(True)
206        #def _callback
207
208def read_key():
209        try:
210                f=open("/etc/n4d/key")
211                f.close()
212                #hack
213                return True
214        except:
215                return False
216
217status=read_key()
218status=True
219
220if not status:
221        print("[!] You need root privileges to run this program [!]")
222        label = Gtk.Label(_("You need root privileges to run mirror-redirect"))
223        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
224        dialog.vbox.pack_start(label,True,True,10)
225        label.show()
226        dialog.set_border_width(6)
227        response = dialog.run()
228        dialog.destroy()
229#       sys.exit(0)
230
231GObject.threads_init()
232Gdk.threads_init()
233win = mainWindow()
234Gtk.main()
Note: See TracBrowser for help on using the repository browser.