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

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

zmdManager and infoManager changes

File size: 3.9 KB
Line 
1#The name of the main class must match the file name in lowercase
2import urllib
3import shutil
4import json
5import os
6from subprocess import call
7import sys
8import threading
9from bs4 import BeautifulSoup
10import random
11import time
12class appimagemanager:
13        def __init__(self):
14                self.dbg=0
15                self.progress=0
16                #This dict defines wich package_type relies on what action
17                #action=example
18                #package='*' (in this case all packages)
19                self.pluginInfo={'install':'appimage','remove':'appimage','pkginfo':'appimage'}
20                self.result={}
21                self.result['data']={}
22                self.result['status']={}
23                self.appImageFolder='/opt/bundles/appimg'
24                self.repoPage='https://dl.bintray.com/probono/AppImages'
25                #To get the description of an app we must go to a specific url.
26                #$(appname) we'll be replaced with the appname so the url matches the right one.
27                #If other site has other url naming convention it'll be mandatory to define it with the appropiate replacements
28                self.infoPage='https://bintray.com/probono/AppImages/$(appname)'
29                self.count=0
30                self.disabled=True
31        #def __init__
32
33        def set_debug(self,dbg='1'):
34                self.dbg=int(dbg)
35                self._debug ("Debug enabled")
36        #def set_debug
37
38        def _debug(self,msg=''):
39                if self.dbg==1:
40                        print ('DEBUG appImg: '+msg)
41        #def debug
42
43        def register(self):
44                return(self.pluginInfo)
45
46        def execute_action(self,action,applist=None):
47                self._chk_installDir()
48                self.progress=0
49                self.result['status']={'status':-1,'msg':''}
50                self.result['data']=list(applist)
51                dataList=[]
52                if self.disabled:
53                        self._set_status(9)
54                else:
55                        for appInfo in applist:
56                                if action=='install':
57                                        dataList.append(self._install_appImg(appInfo))
58                                if action=='remove':
59                                        dataList.append(self._remove_appImg(appInfo))
60                                if action=='pkginfo':
61                                        dataList.append(self._get_info(appInfo))
62                        self.result['data']=list(dataList)
63                self.progress=100
64                return(self.result)
65
66        def _set_status(self,status,msg=''):
67                self.result['status']={'status':status,'msg':msg}
68        #def _set_status
69
70        def _callback(self,partialSize=0,totalSize=0):
71                limit=99
72                if partialSize!=0 and totalSize!=0:
73                        inc=round(partialSize/totalSize,2)*100
74                        self.progress=inc
75                else:
76                        inc=1
77                        margin=limit-self.progress
78                        inc=round(margin/limit,3)
79                        self.progress=(self.progress+inc)
80                if (self.progress>limit):
81                        self.progress=limit
82
83        def _chk_installDir(self):
84                msg_status=True
85                if not os.path.isdir(self.appImageFolder):
86                        try:
87                                os.makedirs(self.appImageFolder)
88                        except:
89                                msg_status=False
90                return msg_status                               
91
92        def _install_appImg(self,appInfo):
93                appInfo=self._get_info(appInfo)
94                if appInfo['state']=='installed':
95                        self._set_status(4)
96                else:
97                        appImgUrl=self.repoPage+'/'+appInfo['appImage']
98                        self._debug("Downloading "+appImgUrl)
99                        dest_path=self.appImageFolder+'/'+appInfo['appImage']
100                        if appImgUrl:
101                                try:
102                                        with urllib.request.urlopen(appImgUrl) as response, open(dest_path, 'wb') as out_file:
103                                                bf=16*1024
104                                                acumbf=0
105                                                appSize=int(response.info()['Content-Length'])
106                                                while True:
107                                                        if acumbf>=appSize:
108                                                            break
109                                                        shutil.copyfileobj(response, out_file,bf)
110                                                        acumbf=acumbf+bf
111                                                        self._callback(acumbf,appSize)
112                                        st = os.stat(dest_path)
113                                        os.chmod(dest_path, st.st_mode | 0o111)
114                                        self._set_status(0)
115                                except:
116                                        self._set_status(5)
117                        else:
118                                self._set_status(12)
119                return appInfo
120        #def _install_appImg
121
122        def _remove_appImg(self,appInfo):
123                self._debug("Removing "+appInfo['appImage'])
124                if os.path.isfile(self.appImageFolder+'/'+appInfo['appImage']):
125                        try:
126                                call([self.appImageFolder+"/"+appInfo['appImage'], "--remove-appimage-desktop-integration"])
127                        except:
128                                pass
129                        try:
130                                os.remove(self.appImageFolder+"/"+appInfo['appImage'])
131                                self._set_status(0)
132                        except:
133                                self._set_status(6)
134                return(appInfo)
135        #def _remove_appImg
136
137        def _get_info(self,appInfo):
138                appInfo['state']='available'
139                if os.path.isfile(self.appImageFolder+'/'+appInfo['appImage']):
140                        appInfo['state']='installed'
141                self._set_status(0)
142                return(appInfo)
143        #def _get_info
144
Note: See TracBrowser for help on using the repository browser.