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

Last change on this file since 7169 was 7169, checked in by Juanma, 18 months ago

Add plugin automanage state status

File size: 5.9 KB
Line 
1import sys
2import os
3import subprocess
4import stat
5import locale
6import tempfile
7try:
8        import xmlrpc.client as n4d
9except ImportError:
10        raise ImportError('xmlrpc not available. Disabling ZmdManager')
11import ssl
12import time
13
14class zmdmanager:
15        def __init__(self):
16                self.locale=locale.getlocale()[0]
17                self.dbg=False
18                self.zmd_folder='/usr/share/zero-center/zmds'
19                self.disabled=None
20                if hasattr(sys,'last_value') or not (os.path.exists(self.zmd_folder)):
21                        #If there's an error at this point it only could be an importError caused by xmlrpc
22                        self.disabled=True
23                self.plugin_actions={'install':'zmd','pkginfo':'zmd','remove':'zmd'}
24                self.progress=0
25                self.n4dclient=''
26                self.result={}
27                self.result['data']=[]
28                self.result['status']={}
29                self.result['status']={'status':-1,'msg':''}
30        #def __init__
31
32        def set_debug(self,dbg=True):
33                self.dbg=dbg
34                self._debug ("Debug enabled")
35        #def set__debug
36
37        def _debug(self,msg=''):
38                if self.dbg:
39                        print ('DEBUG Zmd: %s'%msg)
40        #def _debug
41
42        def register(self):
43                return(self.plugin_actions)
44        #def register
45
46        def execute_action(self,action,applist):
47                self.progress=0
48                self.result['status']={'status':-1,'msg':''}
49                self.result['data']=list(applist)
50                dataList=[]
51                if self.disabled:
52                        self._set_status(9)
53                else:
54                        count=len(applist)
55                        try:
56                                self.n4dclient=self._n4d_connect()
57                                for app_info in applist:
58                                        if (action):
59                                                if action=='install':
60                                                        dataList.append(self._install_Zmd(app_info))
61                                                if action=='remove':
62                                                        dataList.append(self._remove_Zmd(app_info))
63                                                if action=='pkginfo':
64                                                        dataList.append(self._get_Zmd_Info(app_info))
65                                self.result['data']=list(dataList)
66                        except:
67                                self.disabled=True
68                                self._set_status(10)
69                self.progress=100
70                return(self.result)
71        #def execute_action
72       
73        def _set_status(self,status,msg=''):
74                self.result['status']={'status':status,'msg':msg}
75       
76        def _callback(self,zmd_launcher):
77                inc=1
78                limit=99
79                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
80                if zmd_launcher in n4dvars.keys():
81                        if n4dvars[zmd_launcher]['pulsating']:
82                                margin=limit-self.progress
83                                inc=round(margin/limit,3)
84                                self.progress=self.progress+inc
85        #def _callback
86
87        def _install_Zmd(self,app_info):
88                zmd=self.zmd_folder+'/'+app_info['package']+'.zmd'
89                self._debug("Installing "+str(zmd))
90                app_info=self._get_Zmd_Info(app_info)
91                if app_info['state']=='installed':
92                        err=4
93                else:
94                        if os.path.exists(zmd):
95                                err=0
96                                try:
97                                        zmd_sudo=['pe',zmd]
98                                        self._debug("executing "+str(zmd_sudo))
99                                        launched_zmd=subprocess.Popen(zmd_sudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
100                                        zmd_launcher=os.path.basename(zmd)
101                                        zmd_launcher=os.path.splitext(zmd_launcher)[0]
102                                        while launched_zmd.poll() is None:
103                                                self._callback(zmd_launcher)
104                                                time.sleep(0.4)
105                                        zmd_status=launched_zmd.stdout.read()
106                                        zmd_err=launched_zmd.stderr.read()
107                                        self._debug("Error: "+str(zmd_err))
108                                        self._debug("Result: "+str(zmd_status))
109                                except Exception as e:
110                                        self._debug(str(e))
111                                finally:
112                                        app_info=self._get_Zmd_Info(app_info)
113                                        if app_info['state']!='installed':
114                                                err=5
115                        else:
116                                err=8
117                self._set_status(err)
118                return(app_info)
119        #def _install_Zmd
120
121        def _remove_Zmd(self,app_info):
122                zmd=app_info['package']+'.zmd'
123                self._debug("Removing "+str(zmd))
124                os.chdir(self.zmd_folder)
125                sw_continue=False
126                err=0
127                try:
128                        remove_packages=[]
129                        f=open(zmd,'r')
130                        for line in f:
131                                if 'PACKAGE_LIST=' in line:
132                                        sw_continue=True
133                                        packagelist=line.split('=')[-1]
134                                        packagelist=packagelist.replace('"','')
135                                        packagelist=packagelist[:-1]
136                                        #We've the file with the packagelist, now it's time to read the list
137                                        self._debug("Obtaining packages in : "+packagelist)
138                                        f2=open  (packagelist,'r')
139                                        for line2 in f2:
140                                                pkg=line2.split(' ')[0]
141                                                pkg=pkg.split("\t")[0]
142                                                pkg=pkg.replace('"','')
143                                                self._debug("Append to remove list: "+pkg)
144                                                remove_packages.append(pkg)
145                                        f2.close()
146                        f.close()
147                except Exception as e:
148                        err=7
149                        print(str(e))
150                if sw_continue:
151                        zmd_script='/tmp/zmd_script'
152                        f3=open(zmd_script,'w')
153                        f3.write('#!/bin/bash'+"\n")
154                        for pkg in remove_packages:
155                                f3.write('/usr/bin/zero-installer remove '+pkg+"\n")
156                        f3.write ("zero-center set-non-configured "+app_info['package']+"\n")
157                        f3.close()
158                        os.chmod(zmd_script,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)
159                        zmd_sudo=['gksudo',zmd_script]
160                        try:
161                                self._debug("Executing "+str(zmd_sudo))
162                                zmd_launcher=os.path.basename(zmd)
163                                zmd_launcher=os.path.splitext(zmd_launcher)[0]
164                                launched_zmd=subprocess.Popen(zmd_sudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
165                                self._debug("Launched")
166                                while launched_zmd.poll() is None:
167                                        self._callback(zmd_launcher)
168                                        time.sleep(0.2)
169                                zmd_status=launched_zmd.stdout.read()
170                                zmd_err=launched_zmd.stderr.read()
171                        except Exception as e:
172                                err=6
173                                self._debug(str(e))
174                        self._debug("Error: "+str(zmd_err))
175                        self._debug("Result: "+str(zmd_status))
176                        app_info=self._get_Zmd_Info(app_info)
177                        if app_info['state']=='installed':
178                                err=6
179                        os.remove(zmd_script)
180                else:
181                        err=6
182                self._set_status(err)
183                return(app_info)
184        #def _remove_Zmd
185
186        def _get_Zmd_Info(self,app_info):
187                zmd=app_info['package']
188                app_info['state']='Available'
189                try:
190                        n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
191                        if n4dvars:
192                                self._set_status(0)
193                                for key in n4dvars:
194                                        if zmd.lower() in key.lower():
195                                                if 'state' in n4dvars[key]:
196                                                        if n4dvars[key]['state']==1:
197                                                                app_info['state']='installed'
198                        else:
199                                self._set_status(2)
200                except Exception as e:
201                        self._set_status(10)
202                return(app_info)
203        #def _get_Zmd_Info
204       
205        def _n4d_connect(self):
206                #Setup SSL
207                context=ssl._create_unverified_context()
208                n4dclient = n4d.ServerProxy("https://localhost:9779",context=context)
209                return(n4dclient)
210        #def _n4d_connect
Note: See TracBrowser for help on using the repository browser.