Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
tree: b1c0140cfc
Fetching contributors…

Cannot retrieve contributors at this time

executable file 246 lines (204 sloc) 7.514 kB
#!/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)
Jump to Line
Something went wrong with that request. Please try again.