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

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

show percentage

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