|
|
|
"""EasyEngine package installation using apt-get module."""
|
|
|
|
import apt
|
|
|
|
import apt_pkg
|
|
|
|
import sys
|
|
|
|
from ee.core.logging import Log
|
|
|
|
|
|
|
|
|
|
|
|
class EEAptGet():
|
|
|
|
"""Generic apt-get intialisation"""
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
"""Similar to apt-get update"""
|
|
|
|
|
|
|
|
# app.log.debug("Update cache")
|
|
|
|
cache = apt.Cache()
|
|
|
|
fprogress = apt.progress.text.AcquireProgress()
|
|
|
|
iprogress = apt.progress.base.InstallProgress()
|
|
|
|
cache.update()
|
|
|
|
|
|
|
|
def upgrade(self, packages):
|
|
|
|
"""Similar to apt-get update"""
|
|
|
|
cache = apt.Cache()
|
|
|
|
fprogress = apt.progress.text.AcquireProgress()
|
|
|
|
iprogress = apt.progress.base.InstallProgress()
|
|
|
|
my_selected_packages = []
|
|
|
|
# Cache Initialization
|
|
|
|
if not cache:
|
|
|
|
cache = apt.Cache()
|
|
|
|
# Cache Read
|
|
|
|
cache.open()
|
|
|
|
for package in packages:
|
|
|
|
pkg = cache[package]
|
|
|
|
# Check Package Installed
|
|
|
|
if pkg.is_installed:
|
|
|
|
# Check Package is Upgradeble
|
|
|
|
if pkg.is_upgradable:
|
|
|
|
with cache.actiongroup():
|
|
|
|
# Mark Package for Upgrade
|
|
|
|
pkg.mark_upgrade()
|
|
|
|
my_selected_packages.append(pkg.installed)
|
|
|
|
else:
|
|
|
|
print("\'{package_name}-{package_ver.version}\'"
|
|
|
|
"already the newest version"
|
|
|
|
.format(package_name=pkg.name,
|
|
|
|
package_ver=pkg.installed))
|
|
|
|
|
|
|
|
# Check if packages available for install.
|
|
|
|
if len(my_selected_packages) > 0:
|
|
|
|
print("The following packages will be upgraded:"
|
|
|
|
"\n {pkg_name}"
|
|
|
|
.format(pkg_name=my_selected_packages))
|
|
|
|
print("{pkg_install_count} newly installed."
|
|
|
|
.format(pkg_upgrade_count=len(my_selected_packages)))
|
|
|
|
print("Need to get {req_download} bytes of archives"
|
|
|
|
.format(req_download=cache.required_download))
|
|
|
|
print("After this operation, {space} bytes of"
|
|
|
|
"additional disk space will be used."
|
|
|
|
.format(space=cache.required_space))
|
|
|
|
try:
|
|
|
|
# Commit changes in cache (actually install)
|
|
|
|
cache.commit(fprogress, iprogres)
|
|
|
|
except Exception as e:
|
|
|
|
print("package installation failed. [{err}]"
|
|
|
|
.format(err=str(e)))
|
|
|
|
return(False)
|
|
|
|
return(True)
|
|
|
|
|
|
|
|
def install(self, packages):
|
|
|
|
"""Installation of packages"""
|
|
|
|
cache = apt.Cache()
|
|
|
|
fprogress = apt.progress.text.AcquireProgress()
|
|
|
|
iprogress = apt.progress.base.InstallProgress()
|
|
|
|
my_selected_packages = []
|
|
|
|
# Cache Initialization
|
|
|
|
if not cache:
|
|
|
|
cache = apt.Cache()
|
|
|
|
# Cache Read
|
|
|
|
cache.open()
|
|
|
|
|
|
|
|
for package in packages:
|
|
|
|
try:
|
|
|
|
pkg = cache[package]
|
|
|
|
except KeyError as e:
|
|
|
|
continue
|
|
|
|
# Check Package Installed
|
|
|
|
if pkg.is_installed or pkg.marked_install:
|
|
|
|
# Check Package is Upgradeble
|
|
|
|
if pkg.is_upgradable:
|
|
|
|
print("latest version of \'{package_name}\' available."
|
|
|
|
.format(package_name=pkg.installed))
|
|
|
|
else:
|
|
|
|
# Check if package already marked for install
|
|
|
|
if not pkg.marked_install:
|
|
|
|
print("\'{package_name}-{package_ver}\'"
|
|
|
|
"already the newest version"
|
|
|
|
.format(package_name=pkg.shortname,
|
|
|
|
package_ver=pkg.installed))
|
|
|
|
else:
|
|
|
|
with cache.actiongroup():
|
|
|
|
# Mark Package for Installation
|
|
|
|
pkg.mark_install()
|
|
|
|
my_selected_packages.append(pkg.name)
|
|
|
|
|
|
|
|
# Check if packages available for install.
|
|
|
|
if cache.install_count > 0:
|
|
|
|
print("The following NEW packages will be installed:"
|
|
|
|
"\n {pkg_name}"
|
|
|
|
.format(pkg_name=my_selected_packages))
|
|
|
|
print("{pkg_install_count} newly installed."
|
|
|
|
.format(pkg_install_count=cache.install_count))
|
|
|
|
print("Need to get {req_download} bytes of archives"
|
|
|
|
.format(req_download=cache.required_download))
|
|
|
|
print("After this operation, {space:.2f} MB of"
|
|
|
|
" additional disk space will be used."
|
|
|
|
.format(space=cache.required_space/1e6))
|
|
|
|
try:
|
|
|
|
# Commit changes in cache (actually install)
|
|
|
|
cache.commit()
|
|
|
|
except Exception as e:
|
|
|
|
print("package installation failed. [{err}]"
|
|
|
|
.format(err=str(e)))
|
|
|
|
return(False)
|
|
|
|
return(True)
|
|
|
|
|
|
|
|
def remove(self, packages, auto=False, purge=False):
|
|
|
|
def __dependencies_loop(cache, deplist, pkg, onelevel=True):
|
|
|
|
""" Loops through pkg's dependencies.
|
|
|
|
Returns a list with every package found. """
|
|
|
|
if onelevel:
|
|
|
|
onelevellist = []
|
|
|
|
if not pkg.is_installed:
|
|
|
|
return
|
|
|
|
for depf in pkg.installed.dependencies:
|
|
|
|
for dep in depf:
|
|
|
|
# if (dep.name in cache and not cache[dep.name]
|
|
|
|
# in deplist):
|
|
|
|
# deplist.append(cache[dep.name])
|
|
|
|
# __dependencies_loop(cache, deplist, cache[dep.name])
|
|
|
|
# if onelevel:
|
|
|
|
if dep.name in cache:
|
|
|
|
if (cache[dep.name].is_installed and
|
|
|
|
cache[dep.name].is_auto_installed):
|
|
|
|
onelevellist.append(cache[dep.name])
|
|
|
|
# if onelevel:
|
|
|
|
return onelevellist
|
|
|
|
|
|
|
|
cache = apt.Cache()
|
|
|
|
fprogress = apt.progress.text.AcquireProgress()
|
|
|
|
iprogress = apt.progress.base.InstallProgress()
|
|
|
|
|
|
|
|
onelevel = []
|
|
|
|
|
|
|
|
my_selected_packages = []
|
|
|
|
# Cache Initialization
|
|
|
|
if not cache:
|
|
|
|
cache = apt.Cache()
|
|
|
|
# Cache Read
|
|
|
|
cache.open()
|
|
|
|
for package in packages:
|
|
|
|
print("processing", package)
|
|
|
|
try:
|
|
|
|
pkg = cache[package]
|
|
|
|
except KeyError as e:
|
|
|
|
Log.debug(self, "{0}".format(e))
|
|
|
|
continue
|
|
|
|
if not pkg.is_installed:
|
|
|
|
Log.info(self, "Package '{package_name}' is not installed,"
|
|
|
|
" so not removed."
|
|
|
|
.format(package_name=pkg.name))
|
|
|
|
continue
|
|
|
|
my_selected_packages.append(pkg.name)
|
|
|
|
# How logic works:
|
|
|
|
# 1) We loop trough dependencies's dependencies and add them to
|
|
|
|
# the list.
|
|
|
|
# 2) We sequentially remove every package in list
|
|
|
|
# - via is_auto_installed we check if we can safely remove it
|
|
|
|
deplist = []
|
|
|
|
onelevel = onelevel + __dependencies_loop(cache, deplist, pkg,
|
|
|
|
onelevel=True)
|
|
|
|
# Mark for deletion the first package, to fire up
|
|
|
|
# auto_removable Purge?
|
|
|
|
|
|
|
|
try:
|
|
|
|
if purge:
|
|
|
|
pkg.mark_delete(purge=True)
|
|
|
|
else:
|
|
|
|
pkg.mark_delete(purge=False)
|
|
|
|
except SystemError as e:
|
|
|
|
Log.debug(self, "{0}".format(e))
|
|
|
|
apt.ProblemResolver(cache).remove(pkg)
|
|
|
|
# print(pkg.inst_state)
|
|
|
|
# Log.error(self, "Unable to purge packages.")
|
|
|
|
|
|
|
|
for dep in onelevel:
|
|
|
|
my_selected_packages.append(dep.name)
|
|
|
|
try:
|
|
|
|
if purge:
|
|
|
|
dep.mark_delete(purge=True)
|
|
|
|
else:
|
|
|
|
dep.mark_delete(purge=False)
|
|
|
|
except SystemError as e:
|
|
|
|
Log.debug(self, "{0}".format(e))
|
|
|
|
Log.error(self, "Unable to purge depedencies.")
|
|
|
|
|
|
|
|
# Check if packages available for remove/update.
|
|
|
|
if cache.delete_count > 0:
|
|
|
|
# app.log.debug('packages will be REMOVED ')
|
|
|
|
print("The following packages will be REMOVED:"
|
|
|
|
"\n {pkg_name}"
|
|
|
|
.format(pkg_name=my_selected_packages))
|
|
|
|
print("{pkg_remove_count} to remove."
|
|
|
|
.format(pkg_remove_count=cache.delete_count))
|
|
|
|
# app.log.debug('bytes disk space will be freed')
|
|
|
|
print("After this operation, {space:.2f} MB disk space "
|
|
|
|
"will be freed.".format(space=cache.required_space/1e6))
|
|
|
|
try:
|
|
|
|
cache.commit(fprogress, iprogress)
|
|
|
|
except Exception as e:
|
|
|
|
# app.log.error('Sorry, package installation failed ')
|
|
|
|
print("Sorry, package installation failed [{err}]"
|
|
|
|
.format(err=str(e)))
|
|
|
|
return(False)
|
|
|
|
return(True)
|
|
|
|
|
|
|
|
def is_installed(self, package):
|
|
|
|
cache = apt.Cache()
|
|
|
|
fprogress = apt.progress.text.AcquireProgress()
|
|
|
|
iprogress = apt.progress.base.InstallProgress()
|
|
|
|
|
|
|
|
# Cache Initialization
|
|
|
|
if not cache:
|
|
|
|
cache = apt.Cache()
|
|
|
|
# Cache Read
|
|
|
|
cache.open()
|
|
|
|
try:
|
|
|
|
pkg = cache[package]
|
|
|
|
# Check Package Installed
|
|
|
|
if pkg.is_installed:
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
except KeyError as e:
|
|
|
|
Log.debug(self, "{0}".format(e))
|
|
|
|
except Exception as e:
|
|
|
|
return False
|