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

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

progress bar

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