source: lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/zmdManager.py @ 4347

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

ZmdManager? bugfix

File size: 5.1 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                self.result['data']=[]
21                self.result['status']={}
22        #def __init__
23
24        def set_debug(self,dbg='1'):
25                self.dbg=int(dbg)
26                self._debug ("Debug enabled")
27        #def set__debug
28
29        def _debug(self,msg=''):
30                if self.dbg==1:
31                        print ('DEBUG Zmd: '+str(msg))
32        #def _debug
33
34        def register(self):
35                return(self.pluginInfo)
36        #def register
37
38        def execute_action(self,action,applist):
39                count=len(applist)
40                self.n4dclient=self._n4d_connect()
41                self.result['status']={'status':-1,'msg':''}
42                self.result['data']=[]
43                for appInfo in applist:
44                        if not (os.path.exists(self.zmdPath)):
45                                return applist;
46                if (action):
47                                if action=='install':
48                                        self.result['data'].append(self._install_Zmd(appInfo))
49                                if action=='remove':
50                                        self.result['data'].append(self._remove_Zmd(appInfo))
51                                if action=='pkginfo':
52                                        self.result['data'].append(self._get_Zmd_Info(appInfo))
53                self.progress=100
54                return(self.result)
55        #def execute_action
56       
57        def _set_status(self,status,msg=''):
58                self.result['status']={'status':status,'msg':msg}
59       
60        def _callback(self,zmdLauncher):
61                inc=1
62                limit=99
63                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
64                if zmdLauncher in n4dvars.keys():
65                        if n4dvars[zmdLauncher]['pulsating']:
66                                margin=limit-self.progress
67                                inc=round(margin/limit,3)
68                                self.progress=self.progress+inc
69        #def _callback
70
71        def _install_Zmd(self,appInfo):
72                zmd=self.zmdPath+'/'+appInfo['package']+'.zmd'
73                self._debug("Installing "+str(zmd))
74                err=0
75                try:
76                        zmdsudo=['gksudo',zmd]
77                        self._debug("executing "+str(zmdsudo))
78                        zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
79                        zmdLauncher=os.path.basename(zmd)
80                        zmdLauncher=os.path.splitext(zmdLauncher)[0]
81                        while zmdCmd.poll() is None:
82                                self._callback(zmdLauncher)
83                                time.sleep(0.4)
84                        zmdResult=zmdCmdtdout.read()
85                        zmdError=zmdCmd.stderr.read()
86                        self._debug("Error: "+str(zmdError))
87                        self._debug("Result: "+str(zmdResult))
88                        appInfo=self._get_Zmd_Info(appInfo)
89                        if appInfo['status']!='Installed':
90                                err=5
91                except Exception as e:
92                        appInfo=self._get_Zmd_Info(appInfo)
93                        self._debug(str(e))
94                        if appInfo['status']!='Installed':
95                                err=5
96                self._set_status(err)
97                return err
98        #def _install_Zmd
99
100        def _remove_Zmd(self,appInfo):
101                zmd=appInfo['package']+'.zmd'
102                self._debug("Removing "+str(zmd))
103                os.chdir(self.zmdPath)
104                sw_continue=False
105                err=0
106                try:
107                        removePackages=[]
108                        f=open(zmd,'r')
109                        for line in f:
110                                if 'PACKAGE_LIST=' in line:
111                                        sw_continue=True
112                                        packagelist=line.split('=')[-1]
113                                        packagelist=packagelist.replace('"','')
114                                        packagelist=packagelist[:-1]
115                                        #We've the file with the packagelist, now it's time to read the list
116                                        self._debug("Obtaining packages in : "+packagelist)
117                                        f2=open  (packagelist,'r')
118                                        for line2 in f2:
119                                                pkg=line2.split(' ')[0]
120                                                pkg=pkg.split("\t")[0]
121                                                pkg=pkg.replace('"','')
122                                                self._debug("Append to remove list: "+pkg)
123                                                removePackages.append(pkg)
124                                        f2.close()
125                        f.close()
126                except Exception as e:
127                        err=7
128                        print(str(e))
129                if sw_continue:
130                        zeroScript='/tmp/zeroScript'
131                        f3=open(zeroScript,'w')
132                        f3.write('#!/bin/bash'+"\n")
133                        for pkg in removePackages:
134                                f3.write('/usr/bin/zero-installer remove '+pkg+"\n")
135                        f3.write ("zero-center set-non-configured "+appInfo['package']+"\n")
136                        f3.close()
137                        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)
138                        zmdsudo=['gksudo',zeroScript]
139                        try:
140                                self._debug("Executing "+str(zmdsudo))
141                                zmdLauncher=os.path.basename(zmd)
142                                zmdLauncher=os.path.splitext(zmdLauncher)[0]
143                                zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
144                                self._debug("Launched")
145                                while zmdCmd.poll() is None:
146                                        self._callback(zmdLauncher)
147                                        time.sleep(0.2)
148                                zmdResult=zmdCmd.stdout.read()
149                                zmdError=zmdCmd.stderr.read()
150                        except Exception as e:
151                                err=6
152                                self._debug((str(e))
153                        self._debug("Error: "+str(zmdError))
154                        self._debug("Result: "+str(zmdResult))
155                        appInfo=self._get_Zmd_Info(appInfo)
156                        if appInfo['status']=='Installed':
157                                err=6
158                        self._set_status(err)
159                        os.remove(zeroScript)
160                        return err
161        #def _remove_Zmd
162
163        def _get_Zmd_Info(self,appInfo):
164                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
165                zmd=appInfo['package']
166                appInfo['status']='Available'
167                for key in n4dvars:
168                        if zmd.lower() in key.lower():
169                                if n4dvars[key]['state']==1:
170                                        appInfo['status']='Installed'
171
172                self._set_status(6)
173#               self.result['data'].append(appInfo)
174#               self.result.append(appInfo)
175                return(appInfo)
176        #def _get_Zmd_Info
177       
178        def _n4d_connect(self):
179                #Setup SSL
180                context=ssl._create_unverified_context()
181                n4dclient = n4d.ServerProxy("https://localhost:9779",context=context)
182                return(n4dclient)
183        #def _n4d_connect
Note: See TracBrowser for help on using the repository browser.