Package screenlets :: Module install
[hide private]
[frames] | no frames]

Source Code for Module screenlets.install

  1  # This application is released under the GNU General Public License  
  2  # v3 (or, at your option, any later version). You can find the full  
  3  # text of the license under http://www.gnu.org/licenses/gpl.txt.  
  4  # By using, editing and/or distributing this software you agree to  
  5  # the terms and conditions of this license.  
  6  # Thank you for using free software! 
  7  # 
  8  #  screenlets.install (c) RYX (Rico Pfaus 2007) <ryx@ryxperience.com>, 
  9  #  Whise (Helder Fraga) 2008 <helder.fraga@hotmail.com> 
 10  # 
 11   
 12  import screenlets 
 13  from screenlets import utils 
 14  import os 
 15  import gettext 
 16  gettext.textdomain('screenlets') 
 17  gettext.bindtextdomain('screenlets', '/usr/share/locale') 
 18   
 19   
 20  # stub for gettext 
21 -def _(s):
22 #return s 23 return gettext.gettext(s)
24 25 26 if os.geteuid()==0: 27 # we run as root, install system-wide 28 USER = 0 29 DIR_USER = screenlets.DIR_USER_ROOT 30 DIR_AUTOSTART = '/etc/xdg/autostart' # TODO: use pyxdg here 31 else: 32 # we run as normal user, install into $HOME 33 USER = 1 34 DIR_USER = screenlets.DIR_USER 35 DIR_AUTOSTART = utils.get_autostart_dir() 36
37 -class ScreenletInstaller(object):
38 """A simple utility to install screenlets into the current user's directory 39 (so either into $HOME/.screenlets/ for normal users or, if run as root, 40 into screenlets.INSTALL_PREFIX/share/screenlets/).""" 41
42 - def __init__ (self):
43 self._message = ''
44 45
46 - def get_info_from_package_name (self, filename):
47 """Return all info we can get from the package-name or return None 48 if something went wrong. If nothing failed, the returned value is 49 a 4-tuple of the form: (name, version, basename, extension).""" 50 base = os.path.basename(filename) 51 ext = str(filename)[len(str(filename)) -3:] 52 # prepend "tar." if we have a bz2 or gz archive 53 tar_opts = 'xfz' 54 if ext == 'bz2': 55 tar_opts = 'xfj' 56 if ext == 'skz': 57 screenlets.show_error(None,_('This type of karamba theme is not supported yet\n Only older versions can be used')) 58 return False 59 # extract archive to temporary dir 60 61 if not os.path.isdir('/tmp/screenlets/'): 62 os.system('mkdir ' + '/tmp/screenlets/') 63 try: os.system('rm -rf /tmp/screenlets/install-temp') 64 except: pass 65 tmpdir = '/tmp/screenlets' + '/install-temp/' 66 os.system('mkdir %s' % tmpdir) 67 68 69 70 os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), tmpdir)) 71 for dd in os.listdir(tmpdir): 72 if str(dd).endswith('.theme'): 73 os.system('mv ' + tmpdir + ' ' + '/tmp/screenlets/' + dd[:-6]) 74 os.system('mkdir %s' % tmpdir) 75 os.system('mv ' + '/tmp/screenlets/' + dd[:-6] + ' '+ tmpdir) 76 name = dd[:-6] 77 return (name, ext) 78 79 for d in tmpdir : #for each item in folders 80 if os.path.exists(d) and os.path.isdir(d): #is it a valid folder? 81 for f in os.listdir(tmpdir): 82 83 name = f 84 try: 85 print name 86 return (name, ext) 87 except: 88 89 return False
90
91 - def get_result_message (self):
92 """Return a human-readable result message about the last operation.""" 93 return self._message
94
95 - def is_installed (self, name):
96 """Checks if the given screenlet with the name defined by 'name' 97 (without trailing 'Screenlet') is already installed in the current 98 install target location.""" 99 return os.path.isdir(DIR_USER + '/' + name)
100
101 - def install (self, filename):
102 """Install a screenlet from a given archive-file. Extracts the 103 contents of the archive to the user's screenlet dir.""" 104 print 'Installing %s' % filename 105 result = False 106 # get name of screenlet 107 #basename = os.path.basename(filename) 108 #extension = os.path.splitext(filename) 109 #name = basename[:basename.find('.')] 110 #print name 111 info = self.get_info_from_package_name(filename) 112 if info == False: 113 self._message= _("Archive is damaged or unsupported, use only tar, bz2 or gz.") 114 return False 115 name = info[0] 116 ext = info[1] 117 118 tar_opts = 'xfz' 119 if ext == 'bz2': 120 tar_opts = 'xfj' 121 122 123 124 # check if screenlet is already installed 125 #found_path = screenlets.utils.find_first_screenlet_path(name) 126 if self.is_installed(name):#found_path != None: 127 if screenlets.show_question(None,(_("The %(slet)sScreenlet is already installed in '%(dir)s'.\nDo you wish to continue?") % {"slet":name, "dir":DIR_USER}),(_('Install %s') % (name))): 128 pass 129 else: 130 self._message= _('%sScreenlet is already installed') % (name) 131 return False 132 # check extension and create appropriate args for tar 133 tmpdir = screenlets.DIR_TMP + '/install-temp' 134 # verify contents 135 if not os.path.isdir('%s/%s' % (tmpdir, name)): 136 # dir missing 137 self._message = _("Invalid archive. Archive must contain a directory with the screenlet's name.") 138 elif not os.path.isfile('%s/%s/%sScreenlet.py' % (tmpdir, name, name)): 139 # Not a screenlet , lets check for karamba theme 140 themename = '' 141 for findtheme in os.listdir('%s/%s/' % (tmpdir, name)): 142 if str(findtheme).lower().endswith('.theme'): 143 print findtheme 144 if themename == '': 145 print tmpdir + '/'+ name + '/' + themename[:-6] + '.py' 146 if not os.path.isfile(tmpdir + '/'+ name + '/' + findtheme[:-6] + '.py'): 147 themename = findtheme[:-6] 148 else: 149 self._message = _("Compatibility for this karamba theme is not yet implemented") 150 return False 151 if themename != '': 152 name1 = name.replace(' ','') 153 name1 = name1.replace('-','') 154 name1 = name1.replace('.','') 155 name1 = name1.replace('_','') 156 print name1 157 #os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 158 #os.system('mkdir %s/%s' % (DIR_USER,name1)) 159 if self.is_installed(name1):os.system('rm -rf %s/%s' % (DIR_USER, name1)) 160 161 os.system('mv %s/%s %s/%s ' % (chr(34) + tmpdir, name + chr(34),DIR_USER,name1))#tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 162 os.system('mkdir %s/%s/themes' % (DIR_USER,name1)) 163 os.system('mkdir %s/%s/themes/default' % (DIR_USER,name1)) 164 os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/karamba.png ' + DIR_USER + '/' + name1 + '/themes/default/') 165 if os.path.isfile(DIR_USER + '/' + name1 + '/icon.png') == False or os.path.isfile(DIR_USER + '/' + name1 + '/icon.svg') == False: 166 os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/karamba.png ' + DIR_USER + '/' + name1 + '/icon.png') 167 widgetengine = open(screenlets.INSTALL_PREFIX + '/share/screenlets-manager/KarambaScreenlet.py', 'r') 168 enginecopy = widgetengine.read() 169 widgetengine.close() 170 widgetengine = None 171 enginecopy = enginecopy.replace('KarambaScreenlet',name1 + 'Screenlet') 172 173 enginesave = open(DIR_USER + '/' + name1 + '/' + name1 + 'Screenlet.py','w') 174 enginesave.write(enginecopy) 175 enginesave.close() 176 self._message = _("Karamba theme was successfully installed") 177 result = True 178 else:self._message = _("Invalid archive. Archive does not contain a screenlet or a valid karamba theme.") 179 180 181 182 183 184 185 186 187 188 189 else: 190 # check for package-info 191 192 if not os.path.isfile('%s/%s/Screenlet.package' % (tmpdir, name)): 193 if screenlets.show_question(None,(_("%s was not packaged with the screenlet packager. Do you wish to continue and try to install it?") % (name)),(_('Install %s') % (name))): 194 pass 195 else: 196 self._message = _("This package was not packaged with the screenlet packager.") 197 return False 198 199 # copy archive to user dir (and create if not exists) 200 utils.create_user_dir() 201 os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 202 # delete package info from target dir 203 os.system('rm %s/%s/Screenlet.package' % (DIR_USER, name)) 204 # set msg/result 205 self._message = _("The %sScreenlet has been succesfully installed.") % name 206 result = True 207 # remove temp contents 208 os.system('rm -rf %s/install-temp' % screenlets.DIR_TMP) 209 # ready 210 return result
211