iso-profiles/mabox-en/desktop-overlay/etc/skel/.config/dmenu-extended/plugins/plugin_systemPackageManager.py

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()