source: lliurex-store/trunk/fuentes/lliurex-appstore.install/usr/bin/plugins/zmdManager.py @ 3093

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

wip on lliurex_apps.xml

File size: 4.6 KB
Line 
1import sys
2import os
3import subprocess
4import stat
5import locale
6import tempfile
7import xmlrpc.client as n4d
8import ssl
9import time
10
11class zmdmanager:
12        def __init__(self):
13                self.locale=locale.getlocale()[0]
14                self.dbg=1
15                self.zmdPath='/usr/share/zero-center/zmds'
16                self.pluginInfo=['install','zmd','pkginfo','zmd','remove','zmd']
17                self.progress=0
18                self.n4dclient=''
19                self.result=[]
20        #def __init__
21
22        def set_debug(self,dbg='1'):
23                self.dbg=int(dbg)
24                self._debug ("Debug enabled")
25        #def set__debug
26
27        def _debug(self,msg=''):
28                if self.dbg==1:
29                        print ('_debug Zmd: '+str(msg))
30        #def _debug
31
32        def register(self):
33                return(self.pluginInfo)
34
35        def execute_action(self,action,applist):
36                count=len(applist)
37                self.n4dclient=self._n4d_connect()
38                for appInfo in applist:
39                        if not (os.path.exists(self.zmdPath)):
40                                exit(1)
41                        if (action):
42                                if action=='install':
43                                        self._install_Zmd(appInfo)
44                                if action=='remove':
45                                        self._remove_Zmd(appInfo)
46                                if action=='pkginfo':
47                                        self._get_Zmd_Info(appInfo)
48                self.progress=100
49                return(self.result)
50       
51        def _callback(self,zmdLauncher):
52                inc=1
53                limit=99
54                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
55                if zmdLauncher in n4dvars.keys():
56                        if n4dvars[zmdLauncher]['pulsating']:
57                                margin=limit-self.progress
58                                inc=round(margin/limit,3)
59                                self.progress=self.progress+inc
60
61        def _install_Zmd(self,appInfo):
62                zmd=appInfo['installerUrl']
63                self._debug("Installing "+str(zmd))
64                os.chdir(self.zmdPath)
65                try:
66                        zmdsudo=['gksudo',zmd]
67                        zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
68                        zmdLauncher=os.path.basename(zmd)
69                        zmdLauncher=os.path.splitext(zmdLauncher)[0]
70                        while zmdCmd.poll() is None:
71                                self._callback(zmdLauncher)
72                                time.sleep(0.2)
73                        zmdResult=zmdCmd.stdout.read()
74                        zmdError=zmdCmd.stderr.read()
75                        self._debug("Result: "+str(zmdError))
76                        if not zmdError:
77#                               zmdCmd.wait()
78                                self.result=[{appInfo['name']:" installed succesfully"}]
79                        else:
80                                appInfo=self._get_Zmd_Info(appInfo)
81                                if appInfo['status']=='Installed':
82                                        self.result=[{appInfo['name']:" installed succesfully"}]
83                                else:
84                                        self.result=[{appInfo['name']:" failed to install"}]
85                except Exception as e:
86                        self._debug(str(e))
87                        if appInfo['status']=='Installed':
88                                self.result=[{appInfo['name']:" installed succesfully"}]
89                        else:
90                                self.result=[{appInfo['name']:" failed to install"}]
91
92        def _remove_Zmd(self,appInfo):
93                zmd=appInfo['installerUrl']
94                self._debug("Removing "+str(zmd))
95                os.chdir(self.zmdPath)
96                sw_continue=False
97                try:
98                        removePackages=[]
99                        f=open(zmd,'r')
100                        for line in f:
101                                if 'PACKAGE_LIST=' in line:
102                                        sw_continue=False
103                                        packagelist=line.split('=')[-1]
104                                        packagelist=packagelist.replace('"','')
105                                        packagelist=packagelist[:-1]
106                                        #We've the file with the packagelist, now it's time to read the list
107                                        print("Obtaining packages in : "+packagelist)
108                                        f2=open  (packagelist,'r')
109                                        for line2 in f2:
110                                                pkg=line2.split(' ')[0]
111                                                pkg=pkg.split("\t")[0]
112                                                pkg=pkg.replace('"','')
113                                                print("Append: "+pkg)
114                                                removePackages.append(pkg)
115                                        f2.close()
116                        f.close()
117                except Exception as e:
118                        print(str(e))
119                if sw_continue:
120                        zeroScript='/tmp/zeroScript'
121                        f3=open(zeroScript,'w')
122                        f3.write('#!/bin/bash'+"\n")
123                        for pkg in removePackages:
124                                f3.write('/usr/bin/zero-installer remove '+pkg+"\n")
125                        f3.close()
126                        os.chmod(zeroScript,stat.S_IEXEC|stat.S_IREAD|stat.S_IWRITE|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH|stat.S_IRGRP|stat.S_IWGRP|stat.S_IXGRP)
127                        zmdsudo=['gksudo',zeroScript]
128                        try:
129                                self._debug("Executing "+str(zmdsudo))
130                                zmdLauncher=os.path.basename(zmd)
131                                zmdLauncher=os.path.splitext(zmdLauncher)[0]
132                                zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
133                                self._debug("Launched")
134                                while zmdCmd.poll() is None:
135                                        self._callback(zmdLauncher)
136                                        time.sleep(0.2)
137                                zmdResult=zmdCmd.stdout.read()
138                                zmdError=zmdCmd.stderr.read()
139                        except Exception as e:
140                                print(str(e))
141                        self._debug("Result: "+str(zmdResult))
142                        self._debug("Error: "+str(zmdError))
143
144        def _get_Zmd_Info(self,appInfo):
145                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
146                zmd=appInfo['installerUrl']
147                zmd=os.path.basename(zmd)
148                zmd=zmd.split('.')[0]
149                appInfo['status']='Available'
150                for key in n4dvars:
151                        if appInfo['name'].lower() in key.lower():
152                                if n4dvars[key]['state']==1:
153                                        appInfo['status']='Installed'
154                self.result.append(appInfo)
155                return(appInfo)
156
157        def _n4d_connect(self):
158                #Setup SSL
159                context=ssl._create_unverified_context()
160                n4dclient = n4d.ServerProxy("https://localhost:9779",context=context)
161                return(n4dclient)
Note: See TracBrowser for help on using the repository browser.