246 lines
7.3 KiB
Python
246 lines
7.3 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2005-2009 TUBITAK/UEKAE
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free
|
|
# Software Foundation; either version 2 of the License, or (at your option)
|
|
# any later version.
|
|
#
|
|
# Please read the COPYING file.
|
|
#
|
|
|
|
# Disable cyclic garbage collector of Python to avoid comar segmentation
|
|
# faults under high load (#11110)
|
|
import gc
|
|
gc.disable()
|
|
|
|
import os
|
|
import locale
|
|
import string
|
|
|
|
# FIXME: later this will be Comar's job
|
|
systemlocale = open("/etc/mudur/locale", "r").readline().strip()
|
|
|
|
# for pisi
|
|
os.environ["LC_ALL"] = systemlocale
|
|
|
|
# for system error messages
|
|
locale.setlocale(locale.LC_ALL, systemlocale)
|
|
|
|
try:
|
|
import pisi.api
|
|
import pisi.db
|
|
import pisi.ui
|
|
import pisi.util as util
|
|
import pisi.configfile
|
|
from pisi.version import Version
|
|
except KeyboardInterrupt:
|
|
notify("System.Manager", "cancelled", "")
|
|
|
|
class UI(pisi.ui.UI):
|
|
def error(self, msg):
|
|
notify("System.Manager", "error", str(msg))
|
|
|
|
def warning(self, msg):
|
|
notify("System.Manager", "warning", str(msg))
|
|
|
|
def notify(self, event, **keywords):
|
|
if event == pisi.ui.installing:
|
|
pkgname = keywords["package"].name
|
|
notify("System.Manager", "status", ("installing", pkgname, "", ""))
|
|
elif event == pisi.ui.configuring:
|
|
pkgname = keywords["package"].name
|
|
notify("System.Manager", "status", ("configuring", pkgname, "", ""))
|
|
elif event == pisi.ui.extracting:
|
|
pkgname = keywords["package"].name
|
|
notify("System.Manager", "status", ("extracting", pkgname, "", ""))
|
|
elif event == pisi.ui.updatingrepo:
|
|
reponame = keywords["name"]
|
|
notify("System.Manager", "status", ("updatingrepo", reponame, "", ""))
|
|
elif event == pisi.ui.removing:
|
|
pkgname = keywords["package"].name
|
|
notify("System.Manager", "status", ("removing", pkgname, "", ""))
|
|
elif event == pisi.ui.cached:
|
|
total = str(keywords["total"])
|
|
cached = str(keywords["cached"])
|
|
notify("System.Manager", "status", ("cached", total, cached, ""))
|
|
elif event == pisi.ui.installed:
|
|
notify("System.Manager", "status", ("installed", "", "", ""))
|
|
elif event == pisi.ui.removed:
|
|
notify("System.Manager", "status", ("removed", "", "", ""))
|
|
elif event == pisi.ui.upgraded:
|
|
notify("System.Manager", "status", ("upgraded", "", "", ""))
|
|
elif event == pisi.ui.packagestogo:
|
|
notify("System.Manager", "status", ("order", "", "", ""))
|
|
elif event == pisi.ui.desktopfile:
|
|
filepath = keywords["desktopfile"]
|
|
notify("System.Manager", "status", ("desktopfile", filepath, "", ""))
|
|
else:
|
|
return
|
|
|
|
def ack(self, msg):
|
|
return True
|
|
|
|
def confirm(self, msg):
|
|
return True
|
|
|
|
def display_progress(self, operation, percent, info="", **kw):
|
|
if operation == "fetching":
|
|
file_name = kw["filename"]
|
|
if not file_name.startswith("pisi-index.xml"):
|
|
file_name = pisi.util.parse_package_name(file_name)[0]
|
|
out = (operation, file_name, str(percent), int(kw["rate"]), kw["symbol"], int(kw["downloaded_size"]), int(kw["total_size"]))
|
|
else:
|
|
out = (operation, str(percent), info, 0, 0, 0, 0)
|
|
notify("System.Manager", "progress", out)
|
|
|
|
def _init_pisi():
|
|
ui = UI()
|
|
try:
|
|
pisi.api.set_userinterface(ui)
|
|
except KeyboardInterrupt:
|
|
cancelled()
|
|
|
|
def cancelled():
|
|
notify("System.Manager", "cancelled", None)
|
|
|
|
def started(operation=""):
|
|
notify("System.Manager", "started", operation)
|
|
|
|
def finished(operation=""):
|
|
if operation in ["System.Manager.setCache", "System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"]:
|
|
__checkCacheLimits()
|
|
|
|
notify("System.Manager", "finished", operation)
|
|
|
|
def privileged(func):
|
|
"""
|
|
Decorator for synchronizing privileged functions
|
|
"""
|
|
def wrapper(*__args,**__kw):
|
|
operation = "System.Manager.%s" % func.func_name
|
|
|
|
started(operation)
|
|
_init_pisi()
|
|
try:
|
|
func(*__args,**__kw)
|
|
except KeyboardInterrupt:
|
|
cancelled()
|
|
return
|
|
except Exception, e:
|
|
notify("System.Manager", "error", str(e))
|
|
return
|
|
finished(operation)
|
|
|
|
return wrapper
|
|
|
|
@privileged
|
|
def installPackage(package=None):
|
|
if package:
|
|
package = package.split(",")
|
|
reinstall = package[0].endswith(".pisi")
|
|
pisi.api.install(package, ignore_file_conflicts=True, reinstall=reinstall)
|
|
|
|
@privileged
|
|
def reinstallPackage(package=None):
|
|
if package:
|
|
package = package.split(",")
|
|
pisi.api.install(package, ignore_file_conflicts=True, reinstall=True)
|
|
|
|
@privileged
|
|
def updatePackage(package=None):
|
|
if package is None:
|
|
package = []
|
|
else:
|
|
package = package.split(",")
|
|
pisi.api.upgrade(package)
|
|
|
|
@privileged
|
|
def removePackage(package=None):
|
|
if package:
|
|
package = package.split(",")
|
|
pisi.api.remove(package)
|
|
|
|
@privileged
|
|
def updateRepository(repository=None):
|
|
if repository:
|
|
pisi.api.update_repo(repository)
|
|
|
|
@privileged
|
|
def updateAllRepositories():
|
|
repos = pisi.db.repodb.RepoDB().list_repos()
|
|
for repo in repos:
|
|
try:
|
|
pisi.api.update_repo(repo)
|
|
except pisi.db.repodb.RepoError, e:
|
|
notify("System.Manager", "error", str(e))
|
|
|
|
@privileged
|
|
def addRepository(name=None,uri=None):
|
|
if name and uri:
|
|
pisi.api.add_repo(name,uri)
|
|
|
|
@privileged
|
|
def removeRepository(repo=None):
|
|
if repo:
|
|
pisi.api.remove_repo(repo)
|
|
|
|
@privileged
|
|
def setRepoActivities(repos=None):
|
|
if repos:
|
|
for repo, active in repos.items():
|
|
pisi.api.set_repo_activity(repo, active)
|
|
|
|
@privileged
|
|
def setRepositories(repos):
|
|
oldRepos = pisi.db.repodb.RepoDB().list_repos(only_active=False)
|
|
|
|
for repo in oldRepos:
|
|
pisi.api.remove_repo(repo)
|
|
|
|
for repo in repos:
|
|
pisi.api.add_repo(repo[0], repo[1])
|
|
|
|
@privileged
|
|
# ex: setConfig("general", "bandwidth_limit", "30")
|
|
def setConfig(category, name, value):
|
|
config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
|
|
config.set(category, name, value)
|
|
|
|
config.write_config()
|
|
|
|
@privileged
|
|
def setCache(enabled, limit):
|
|
config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
|
|
config.set("general", "package_cache", str(enabled))
|
|
config.set("general", "package_cache_limit", str(limit))
|
|
|
|
config.write_config()
|
|
|
|
@privileged
|
|
def takeSnapshot():
|
|
pisi.api.snapshot()
|
|
|
|
@privileged
|
|
def takeBack(operation):
|
|
pisi.api.takeback(operation)
|
|
|
|
@privileged
|
|
def clearCache(cacheDir, limit):
|
|
pisi.api.clearCache(int(limit) == 0)
|
|
|
|
def __checkCacheLimits():
|
|
cached_pkgs_dir = "/var/cache/pisi/packages"
|
|
config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
|
|
cache = config.get("general", "package_cache")
|
|
if cache == "True":
|
|
limit = config.get("general", "package_cache_limit")
|
|
|
|
# If PackageCache is used and limit is 0. It means limitless.
|
|
if limit and int(limit) != 0:
|
|
clearCache(cached_pkgs_dir, int(limit) * 1024 * 1024)
|
|
elif cache == "False":
|
|
clearCache(cached_pkgs_dir, 0)
|