270 lines
11 KiB
Python
270 lines
11 KiB
Python
# -*- coding: utf8 -*-
|
|
import dmenu_extended
|
|
import os
|
|
|
|
|
|
class extension(dmenu_extended.dmenu):
|
|
|
|
title = 'System package management'
|
|
is_submenu = True
|
|
detected_packageManager = False
|
|
|
|
def __init__(self):
|
|
self.load_preferences()
|
|
self.cache_packages = dmenu_extended.path_cache + '/packages.txt'
|
|
|
|
# Determine package manager
|
|
if os.path.exists('/usr/bin/apt-get'):
|
|
# We are Debian based
|
|
self.command_installPackage = 'sudo apt-get install '
|
|
self.command_removePackage = 'sudo apt-get remove '
|
|
self.command_listInstalled = ['dpkg', '-l']
|
|
self.command_listAvailable = ['apt-cache', 'search', '']
|
|
self.command_systemUpdate = 'sudo apt-get update && sudo apt-get upgrade'
|
|
self.detected_packageManager = 'apt-get'
|
|
elif os.path.exists('/usr/bin/yum'):
|
|
# We are Red Hat based
|
|
self.command_installPackage = 'sudo yum install '
|
|
self.command_removePackage = 'sudo yum remove '
|
|
self.command_listInstalled = 'yum list installed'
|
|
self.command_listAvailable = ["yum", "search", ""]
|
|
self.command_systemUpdate = 'sudo yum update'
|
|
self.detected_packageManager = 'yum'
|
|
elif os.path.exists('/usr/bin/dnf'):
|
|
self.command_installPackage = 'sudo dnf install '
|
|
self.command_removePackage = 'sudo dnf remove '
|
|
self.command_listInstalled = 'dnf list installed'
|
|
self.command_listAvailable = ["dnf", "search", ""]
|
|
self.command_systemUpdate = 'sudo dnf update'
|
|
self.detected_packageManager = 'dnf'
|
|
elif os.path.exists('/usr/bin/pacman'):
|
|
# We are Arch based
|
|
self.command_installPackage = 'sudo pacman -S '
|
|
self.command_removePackage = 'sudo pacman -R '
|
|
self.command_listInstalled = 'pacman -Q'
|
|
self.command_listAvailable = 'pacman -Ss'
|
|
self.command_systemUpdate = 'sudo pacman -Syu'
|
|
self.detected_packageManager = 'pacman'
|
|
elif os.path.exists('/usr/bin/emerge'):
|
|
# We are Gentoo based
|
|
self.command_installPackage = 'sudo emerge '
|
|
self.command_removePackage = 'sudo emerge --unmerge '
|
|
self.command_listInstalled = 'cd /var/db/pkg/ && ls -d */* | sed \'s/\-[0-9].*$//\' > ' + dmenu_extended.path_cache + '/tmp.txt'
|
|
self.command_listAvailable = 'emerge --search "" | grep "* " | cut -c 4- | sed "s/\[ Masked \]//g" | sed -n \'/^app-accessibility/,$p\' > ' + dmenu_extended.path_cache + '/tmp.txt'
|
|
self.command_systemUpdate = 'sudo emerge --sync && sudo emerge -uDv @world'
|
|
self.detected_packageManager = 'portage'
|
|
|
|
def install_package(self):
|
|
packages = self.cache_open(self.cache_packages)
|
|
|
|
if packages == False:
|
|
self.menu('No package database exists. Press enter to build cache')
|
|
self.build_package_cache()
|
|
packages = self.cache_open(self.cache_packages)
|
|
|
|
package = self.menu(packages, prompt="Install:")
|
|
|
|
if len(package) > 0:
|
|
self.open_terminal(self.command_installPackage + package.split(' ')[0], True)
|
|
self.rebuild_notice()
|
|
|
|
def remove_package(self):
|
|
self.message_open('Collecting list of installed packages')
|
|
if self.detected_packageManager == 'apt-get':
|
|
packages = self.installedPackages_aptget()
|
|
elif self.detected_packageManager == 'yum':
|
|
packages = self.installedPackages_yum()
|
|
elif self.detected_packageManager == 'dnf':
|
|
packages = self.installedPackages_dnf()
|
|
elif self.detected_packageManager == 'pacman':
|
|
packages = self.installedPackages_pacman()
|
|
elif self.detected_packageManager == 'portage':
|
|
packages = self.u_installedPackages_portage()
|
|
|
|
self.message_close()
|
|
|
|
package = self.select(packages, prompt="Uninstall:")
|
|
if package is not -1:
|
|
self.open_terminal(self.command_removePackage + package, True)
|
|
self.rebuild_notice()
|
|
|
|
def update_package(self):
|
|
self.message_open('Collecting list of installed packages')
|
|
|
|
if self.detected_packageManager == 'apt-get':
|
|
packages = self.installedPackages_aptget()
|
|
elif self.detected_packageManager == 'yum':
|
|
packages = self.installedPackages_yum()
|
|
elif self.detected_packageManager == 'dnf':
|
|
packages = self.installedPackages_dnf()
|
|
elif self.detected_packageManager == 'pacman':
|
|
packages = self.installedPackages_pacman()
|
|
elif self.detected_packageManager == 'portage':
|
|
packages = self.installedPackages_portage()
|
|
|
|
self.message_close()
|
|
|
|
package = self.select(packages, prompt="Update:")
|
|
if package is not -1:
|
|
self.open_terminal(self.command_installPackage + package, True)
|
|
|
|
def build_package_cache(self, message=True):
|
|
if message:
|
|
self.message_open('Building package cache')
|
|
|
|
if self.detected_packageManager == 'apt-get':
|
|
packages = self.availablePackages_aptget()
|
|
elif self.detected_packageManager == 'yum':
|
|
packages = self.availablePackages_yum()
|
|
elif self.detected_packageManager == 'dnf':
|
|
packages = self.availablePackages_dnf()
|
|
elif self.detected_packageManager == 'pacman':
|
|
packages = self.availablePackages_pacman()
|
|
elif self.detected_packageManager == 'portage':
|
|
packages = self.availablePackages_portage()
|
|
|
|
self.cache_save(packages, self.cache_packages)
|
|
if message:
|
|
self.message_close()
|
|
self.menu("Package cache built")
|
|
|
|
def update_system(self):
|
|
self.open_terminal(self.command_systemUpdate, True)
|
|
|
|
def installedPackages_aptget(self):
|
|
packages = self.command_output(self.command_listInstalled)
|
|
out = []
|
|
for package in packages:
|
|
tmp = package.split()
|
|
if len(tmp) > 6:
|
|
out.append(tmp[1])
|
|
out.sort()
|
|
return list(set(out))
|
|
|
|
def installedPackages_yum(self):
|
|
packages = self.command_output(self.command_listInstalled)
|
|
packages.sort()
|
|
return list(set(packages))
|
|
|
|
def installedPackages_dnf(self):
|
|
packages = self.command_output(self.command_listInstalled)
|
|
packages.sort()
|
|
return list(set(packages))
|
|
|
|
def installedPackages_pacman(self):
|
|
packages = self.command_output(self.command_listInstalled)
|
|
out = []
|
|
for package in packages:
|
|
if len(package) > 0 and package[0] != " ":
|
|
out.append(package.split(' ')[0])
|
|
out.sort()
|
|
return list(set(out))
|
|
|
|
def installedPackages_portage(self):
|
|
os.system(self.command_listInstalled)
|
|
packages = self.command_output('cat ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
os.system('rm ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
return packages
|
|
|
|
def u_installedPackages_portage(self):
|
|
os.system('cd /var/db/pkg/ && ls -d */* > ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
packages = self.command_output('cat ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
os.system('rm ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
return packages
|
|
|
|
def availablePackages_aptget(self):
|
|
packages = self.command_output(self.command_listAvailable)
|
|
packages.sort()
|
|
return packages
|
|
|
|
def availablePackages_yum(self):
|
|
packages = self.command_output(self.command_listAvailable)
|
|
out = []
|
|
last = ""
|
|
for package in packages:
|
|
tmp = package.split( ' : ' )
|
|
if len(tmp) > 1:
|
|
if tmp[0][0] == " ":
|
|
last += " " + tmp[1]
|
|
else:
|
|
out.append(last)
|
|
last = tmp[0].split('.')[0] + ' - ' + tmp[1]
|
|
|
|
out.append(last)
|
|
out.sort()
|
|
return list(set(out[1:]))
|
|
|
|
def availablePackages_dnf(self):
|
|
packages = self.command_output(self.command_listAvailable)
|
|
out = []
|
|
last = ""
|
|
for package in packages:
|
|
tmp = package.split( ' : ' )
|
|
if len(tmp) > 1:
|
|
if tmp[0][0] == " ":
|
|
last += " " + tmp[1]
|
|
else:
|
|
out.append(last)
|
|
last = tmp[0].split('.')[0] + ' - ' + tmp[1]
|
|
|
|
out.append(last)
|
|
out.sort()
|
|
return list(set(out[1:]))
|
|
|
|
def availablePackages_pacman(self):
|
|
packages = self.command_output(self.command_listAvailable)
|
|
out = []
|
|
last = ""
|
|
for package in packages:
|
|
if package != "":
|
|
if package[0:3] == " ":
|
|
last += " - " + package[4:]
|
|
else:
|
|
out.append(last)
|
|
last = package
|
|
out.append(last)
|
|
out.sort()
|
|
return list(set(out[1:]))
|
|
|
|
def availablePackages_portage(self):
|
|
os.system(self.command_listAvailable)
|
|
packages = self.command_output('cat ' + dmenu_extended.path_cache + '/tmp.txt')
|
|
os.system('rm ' + dmenu_extended.path_cache + '/tmp*')
|
|
return packages
|
|
|
|
def rebuild_notice(self):
|
|
# gnome-termainal forks from the calling process so this message shows
|
|
# before the action has completed.
|
|
if self.prefs['terminal'] != 'gnome-terminal':
|
|
rebuild = self.menu(["Cache may be out-of-date, rebuild at your convenience.", "* Rebuild cache now"])
|
|
if rebuild == "* Rebuild cache now":
|
|
self.cache_regenerate()
|
|
|
|
def run(self, inputText):
|
|
|
|
if self.detected_packageManager == False:
|
|
self.menu(["Your system package manager could not be determined"])
|
|
self.sys.exit()
|
|
else:
|
|
print('Detected system package manager as ' + str(self.detected_packageManager))
|
|
|
|
items = [self.prefs['indicator_submenu'] + ' Install a new package',
|
|
self.prefs['indicator_submenu'] + ' Uninstall a package',
|
|
self.prefs['indicator_submenu'] + ' Update a package',
|
|
'Rebuild the package cache',
|
|
'Perform system upgrade']
|
|
|
|
selectedIndex = self.select(items, prompt='Action:', numeric=True)
|
|
|
|
if selectedIndex != -1:
|
|
if selectedIndex == 0:
|
|
self.install_package()
|
|
elif selectedIndex == 1:
|
|
self.remove_package()
|
|
elif selectedIndex == 2:
|
|
self.update_package()
|
|
elif selectedIndex == 3:
|
|
self.build_package_cache()
|
|
elif selectedIndex == 4:
|
|
self.update_system()
|