source: lliurex-mirror/trunk/fuentes/lliurex-mirror-cli/usr/sbin/lliurex-mirror @ 3344

Last change on this file since 3344 was 3344, checked in by kbut, 3 years ago

reduce time sleep

  • Property svn:executable set to *
File size: 11.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3import xmlrpclib as x
4import sys
5import getpass
6import tempfile
7from clint import arguments
8from clint.textui import puts, indent, colored
9import os
10import time
11
12class LliurexMirror(object):
13        """docstring for LliurexMirror"""
14        def __init__(self,credentials,host):
15                super(LliurexMirror, self).__init__()
16                self.ip = host if host != None else "localhost"
17                if credentials != None:
18                        self.credentials = credentials
19                else:
20                        try:
21                                self.credentials = self.get_local_credentials()
22                        except:
23                                print("Error: bad credentials")
24                                sys.exit(1)
25                self.client = x.ServerProxy("https://"+self.ip+":9779",allow_none=True)
26                self.localclient = x.ServerProxy("https://localhost:9779",allow_none=True)
27                self.localcredentials = self.get_local_credentials()
28
29        def get_local_credentials(self):
30                try:
31                        f = open('/etc/n4d/key','r')
32                        key = f.readline().strip()
33                        return key
34                except:
35                        return None
36
37        def setCname(self):
38                result = self.client.set_cname(self.credentials,"MirrorManager")
39                print result['msg']
40                return  0 if result['status'] else 1 
41
42        def noninteractiveUpdate(self,mirror,pathtoupdate):
43                self.runDebmirror(mirror,pathtoupdate)
44                counter = 0
45                percentage = 0
46                clockpercentage = 0
47                clock = ['—','/','|','\\']
48                while True:
49                        if  counter ==  0:
50                                result = self.client.get_percentage(self.credentials,"MirrorManager",mirror)
51                                percentage = str(result['msg'])
52                                result = self.client.is_alive(self.credentials,"MirrorManager")
53                                if not result['status']:
54                                        break
55                        progress = clock[clockpercentage]
56                        sys.stdout.write(percentage+" % " + progress)
57                        sys.stdout.flush()
58                        sys.stdout.write("\r")
59                        time.sleep(0.1)
60                        counter += 1
61                        if counter == 40:
62                                counter = 0
63                        clockpercentage +=1
64                        if clockpercentage == 30:
65                                clockpercentage = 0
66                sys.stdout.write("\n")
67
68        def runDebmirror(self,mirror,pathtoupdate):
69
70                if len(pathtoupdate) != 0:
71                        if pathtoupdate.lower().startswith("http"):
72                                self.setMirrorOrig(mirror,pathtoupdate,3)
73                                self.setOptionUpdate(mirror,3)
74                        elif os.path.exists(pathtoupdate):
75                                result = self.client.get_client_ip('','MirrorManager','')
76                                tempserver = result['msg']
77                                result = self.localclient.enable_webserver_into_folder(self.localcredentials,'MirrorManager',pathtoupdate)
78                                tempserver = tempserver + ":" + str(result['msg'])
79                                self.setMirrorOrig(mirror,tempserver,2)
80                                self.setOptionUpdate(mirror,2)
81                        else:
82                                print("Error on orig")
83                                return 2
84                result = self.client.update(self.credentials,"MirrorManager",'',mirror,None)
85                print result['msg']
86                return  0 if result['status'] else 1
87
88        def exportMirror(self,mirror,dest):
89                #
90                # This code is equal on lliurex_mirror_connect.py file. Don't forget modify on both files.
91                #
92                result = self.client.get_all_configs(self.credentials,'MirrorManager')
93                config = result['msg'][mirror]
94                result = self.client.get_client_ip('','MirrorManager','')
95                ip = result['msg']
96                # Open webserver for mirror and get ip
97                result = self.client.enable_webserver_into_folder(self.credentials,'MirrorManager',config['MIRROR_PATH'])
98                port = str(result['msg'])
99                self.remoteport = port
100                # Modify Config and write
101               
102                config['MIRROR_PATH'] = dest
103                config['CURRENT_UPDATE_OPTION'] = '3'
104                config['ORIGS']['3'] = self.ip + ":" + str(port)
105                result = self.client.render_debmirror_config(self.credentials,'MirrorManager',config)
106                temp_file = tempfile.mktemp()
107                f = open(temp_file,'w')
108                f.write(result['msg'])
109                f.close()
110                callback_args = {}
111                callback_args['ip'] = ip
112                callback_args['port'] = port
113                # Execute mirror
114                print self.localclient.get_mirror(self.localcredentials,'MirrorManager',temp_file,callback_args)
115
116        def get_percentage_export(self):
117                try:
118                        result = self.localclient.is_alive_get_mirror(self.localcredentials,'MirrorManager')
119                        print result['msg'][0]
120                        return 0
121                except Exception as e:
122                        print e
123                        return 1
124                       
125        #def get_percentage_export
126
127        def is_alive_export(self):
128                try:
129                        result = self.localclient.is_alive_get_mirror(self.localcredentials,'MirrorManager')
130                        return result
131                except Exception as e:
132                        print e
133                        return None
134
135
136        def setOptionUpdate(self,mirror,option):
137                result = self.client.set_option_update(self.credentials,"MirrorManager",mirror,option)
138                print str(result['msg'])
139                return  0 if result['status'] else 1 
140
141        def isAlive(self):
142                result = self.client.is_alive(self.credentials,"MirrorManager")
143                print "True" if result['status'] else "False"
144                return  0 if result['status'] else 1 
145
146        def getMirrorArchitecture(self,distro):
147                result = self.client.get_mirror_architecture(self.credentials,"MirrorManager",distro)
148                print str(result['msg'])
149                return  0 if result['status'] else 1 
150
151        def setMirrorArchitecture(self,distro,archs):
152                result = self.client.set_mirror_architecture(self.credentials,"MirrorManager",distro,archs)
153                print str(result['msg'])
154                return  0 if result['status'] else 1 
155
156        def getMirrorOrig(self,distro):
157                result = self.client.get_mirror_orig(self.credentials,"MirrorManager",distro)
158                print str(result['msg'])
159                return  0 if result['status'] else 1 
160
161        def setMirrorOrig(self,distro,url,option):
162                result = self.client.set_mirror_orig(self.credentials,"MirrorManager",distro,url,option)
163                print str(result['msg'])
164                return  0 if result['status'] else 1 
165
166        def getChecksumValidation(self,distro):
167                result = self.client.get_checksum_validation(self.credentials,"MirrorManager",distro)
168                print str(result['msg'])
169                return  0 if result['status'] else 1 
170
171        def setChecksumValidation(self,distro,value):
172                check = 0 if not value else 1
173                result = self.client.set_checksum_validation(self.credentials,"MirrorManager",distro,check)
174                print str(result['msg'])
175                return  0 if result['status'] else 1 
176
177        def getPercentage(self,distro):
178                result = self.client.get_percentage(self.credentials,"MirrorManager",distro)
179                print str(result['msg'])
180                return  0 if result['status'] else 1 
181
182        def enableWebserverForPath(self,path):
183                result = self.client.enable_webserver_into_folder(self.credentials,"MirrorManager",path)
184                print str(result['msg'])
185                return  0 if result['status'] else 1 
186
187        def stopWebserver(self,port):
188                result = self.client.stop_webserver(self.credentials,"MirrorManager",port)
189                print str(result['msg'])
190                return  0 if result['status'] else 1 
191
192        def stopUpdate(self):
193                result = self.client.stopupdate(self.credentials,"MirrorManager")
194                print str(result['msg'])
195                return  0 if result['status'] else 1 
196
197        def getAvailableDistros(self):
198                result = self.client.get_available_mirrors(self.credentials,"MirrorManager")
199                print str(result['msg'])
200                return  0 if result['status'] else 1 
201
202        def isMirrorUpdate(self,distro):
203                result = self.client.is_update_available(self.credentials,"MirrorManager",distro)
204                print str(result['msg'])
205                return  0 if result['status'] else 1
206
207def usage():
208        puts("Usage")
209        with indent(4):
210                puts("lliurex-mirror [FLAGS...] ACTION")
211                puts("Actions")
212                with indent(4):
213                        puts("setcname")
214                        puts("update DISTRO [URL|FILEPATH]")
215                        puts("unattendedupdate DISTRO [URL|FILEPATH]")
216                        puts("rundebmirror DISTRO [URL|FILEPATH]")
217                        puts("exportmirror DISTRO DESTMIRROR")
218                        puts("isalive")
219                        puts("isaliveexport")
220                        puts("getmirrorarchitecture")
221                        puts("setmirrorarchitecture [ARCH ARCH ...]")
222                        puts("getmirrororig")
223                        puts("setmirrororig MIRROR URL OPTION")
224                        puts("getchecksumvalidation")
225                        puts("setchecksumvalidation [0|1]")
226                        puts("getpercentage")
227                        puts("getpercentageexport")
228                        puts("enablewebserverforpath PATH")
229                        puts("stopwebserver PORT")
230                        puts("stopupdate")
231                        puts("getavailabledistros")
232                        puts("ismirrorupdate")
233                puts("Flags")
234                with indent(4):
235                        puts("-h --help : Show help")
236                        puts("-H --host : Remove ip to launch mirror actions")
237                        puts("-k --key : Magic key to run lliurex-mirror")
238                        puts("-u --user : User to validation")
239                        puts("-p --password : Password to validation")
240
241                       
242        sys.exit(1)
243
244if __name__ == '__main__':
245        args = arguments.Args().copy
246        host = "localhost"
247        credentials = ""
248        user = None
249        password = None
250        if args.contains(["-h","--help"]) or len(args.all) == 0 :
251                usage()
252       
253        if args.contains(["-H","--host"]):
254                #host = args.value_after()
255                host = args.value_after("-H") if args.value_after("-H") != None else args.value_after("--host")
256                if host == None:
257                        usage()
258
259
260        if not args.contains(["-k","--key","-u","--user","-p","--password","-P","--intpassword"]):
261                if os.access('/etc/n4d/key',os.R_OK):
262                        f = open("/etc/n4d/key","r")
263                        credentials = f.readlines()[0].strip()
264
265        if args.contains(["-u","--user"]):
266                user = args.value_after("-u") if args.value_after("-u") != None else args.value_after("--user")
267                if user == None:
268                        usage()
269                index = args.first(["-u","--user"])
270                args.pop(index)
271                args.pop(index)
272
273        if args.contains(["-p","--password"]):
274                password = args.value_after("-p") if args.value_after("-p") != None else args.value_after("--password")
275                if password == None:
276                        usage()
277
278                index = args.first(["-p","--password"])
279                args.pop(index)
280                args.pop(index)
281
282        if args.contains(["-P","--intpassword"]):
283                if args.contains(["-u","--user"]):
284                        password = getpass.getpass("Password: ")
285                        index = args.first(["-P","--intpassword"])
286                        args.pop(index)
287                else:
288                        usage()
289
290        if user != None and password != None:
291                credentials = (user,password)
292
293        if args.contains(["-k","--key"]):
294                credentials = args.value_after("-k") if args.value_after("-k") != None else args.value_after("--key")
295                if credentials == None:
296                        usage()
297                index = args.first(["-k","--key"])
298                args.pop(index)
299                args.pop(index)
300
301        action = args.pop(0)
302        lliurexmirror = LliurexMirror(credentials,host)
303        if action == "setcname":
304                sys.exit(lliurexmirror.setCname())
305        elif action == "rundebmirror" or action =="update":
306                mirror = args.get(0)
307                pathtoupdate = " ".join(args[1:])
308                lliurexmirror.noninteractiveUpdate(mirror,pathtoupdate)
309        elif action =="unattendedupdate":
310                mirror = args.get(0)
311                pathtoupdate = " ".join(args[1:])
312                sys.exit(lliurexmirror.runDebmirror(mirror,pathtoupdate))
313        elif action == "isalive":
314                sys.exit(lliurexmirror.isAlive())
315        elif action == "isaliveexport":
316                sys.exit(lliurexmirror.is_alive_export())
317        elif action == "getmirrorarchitecture":
318                sys.exit(lliurexmirror.getMirrorArchitecture(args.get(0)))
319        elif action == "setmirrorarchitecture":
320                sys.exit(lliurexmirror.setMirrorArchitecture(args.pop(0),args.all))
321        elif action == "getmirrororig":
322                sys.exit(lliurexmirror.getMirrorOrig(args.get(0)))
323        elif action == "setmirrororig":
324                sys.exit(lliurexmirror.setMirrorOrig(args.get(0),args.get(1)))
325        elif action == "getchecksumvalidation":
326                sys.exit(lliurexmirror.getChecksumValidation(args.get(0)))
327        elif action == "setchecksumvalidation":
328                checkvalue = 1 if args.get(1) == "True" else 0
329                sys.exit(lliurexmirror.setChecksumValidation(args.get(0),checkvalue))
330        elif action == "getpercentage":
331                sys.exit(lliurexmirror.getPercentage(args.get(0)))
332        elif action == "getpercentageexport":
333                sys.exit(lliurexmirror.get_percentage_export())
334        elif action == "enablewebserverforpath":
335                sys.exit(lliurexmirror.enableWebserverForPath(args.get(0)))
336        elif action == "stopwebserver":
337                sys.exit(lliurexmirror.stopWebserver(args.get(0)))
338        elif action == "getavailabledistros":
339                sys.exit(lliurexmirror.getAvailableDistros())
340        elif action == "stopupdate":
341                sys.exit(lliurexmirror.stopUpdate())
342        elif action == "ismirrorupdate":
343                sys.exit(lliurexmirror.isMirrorUpdate(args.get(0)))
344        elif action == "exportmirror":
345                mirror = args.get(0)
346                destmirror = " ".join(args[1:])
347                sys.exit(lliurexmirror.exportMirror(mirror,destmirror))
348               
Note: See TracBrowser for help on using the repository browser.