From 677ff42a00ef7a791bb5c39fb724b4c255f22440 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 6 Apr 2011 13:22:23 +0200 Subject: [PATCH] Initial commit of the pakfire server stuff. --- examples/pakfire.conf | 10 ++ pakfire/__init__.py | 7 +- pakfire/builder.py | 8 +- pakfire/cli.py | 74 ++++++++++- pakfire/config.py | 14 +++ pakfire/packages/__init__.py | 15 +++ pakfire/packages/base.py | 4 + pakfire/packages/packager.py | 3 + pakfire/repository/__init__.py | 2 +- pakfire/repository/index.py | 27 ++-- pakfire/repository/local.py | 37 +++++- pakfire/server/__init__.py | 5 + pakfire/server/master.py | 221 +++++++++++++++++++++++++++++++++ pakfire/server/slave.py | 28 +++++ pakfire/util.py | 2 +- po/pakfire.pot | 136 +++++++++++--------- setup.py | 8 +- 17 files changed, 517 insertions(+), 84 deletions(-) create mode 100644 pakfire/server/__init__.py create mode 100644 pakfire/server/master.py create mode 100644 pakfire/server/slave.py diff --git a/examples/pakfire.conf b/examples/pakfire.conf index 90d80f1a2..2c328c307 100644 --- a/examples/pakfire.conf +++ b/examples/pakfire.conf @@ -12,3 +12,13 @@ slogan = Gluttony vendor = ipfire arch = i686 + + +[master] +server = http://172.28.1.250/api/master + +resultdir = /packages + + +[slave] +server = http://172.28.1.250/api/slave diff --git a/pakfire/__init__.py b/pakfire/__init__.py index ccca46159..ecc6df035 100644 --- a/pakfire/__init__.py +++ b/pakfire/__init__.py @@ -146,7 +146,7 @@ class Pakfire(object): finally: b.destroy() - def dist(self, pkgs, resultdirs=None): + def dist(self, pkgs, resultdirs=None, destroy=True): self.check_build_mode() # Select first package out of pkgs. @@ -186,7 +186,8 @@ class Pakfire(object): # Cleanup all the stuff from pkg. b.cleanup() finally: - b.destroy() + if destroy: + b.destroy() def install(self, requires): ds = depsolve.DependencySet(pakfire=self) @@ -251,7 +252,7 @@ class Pakfire(object): return pkgs def repo_create(self, path, input_paths): - repo = repository.LocalRepository( + repo = repository.LocalBinaryRepository( self, name="new", description="New repository.", diff --git a/pakfire/builder.py b/pakfire/builder.py index eb6b363e5..bdac3e88b 100644 --- a/pakfire/builder.py +++ b/pakfire/builder.py @@ -238,6 +238,11 @@ class Builder(object): return ret def prepare(self): + prepared_tag = ".prepared" + + if os.path.exists(self.chrootPath(prepared_tag)): + return + # Create directory. if not os.path.exists(self.path): os.makedirs(self.path) @@ -272,7 +277,8 @@ class Builder(object): # Create neccessary files like /etc/fstab and /etc/mtab. files = ( "etc/fstab", - "etc/mtab" + "etc/mtab", + prepared_tag, ) for file in files: diff --git a/pakfire/cli.py b/pakfire/cli.py index 7777edab9..18996c6e0 100644 --- a/pakfire/cli.py +++ b/pakfire/cli.py @@ -5,6 +5,7 @@ import sys import packages import repository +import server import util from pakfire import Pakfire @@ -379,9 +380,78 @@ class CliRepo(Cli): class CliMaster(Cli): - pass + def __init__(self): + self.parser = argparse.ArgumentParser( + description = _("Pakfire master command line interface."), + ) + + self.parse_common_arguments() + + # Add sub-commands. + self.sub_commands = self.parser.add_subparsers() + + self.parse_command_update() + + # Finally parse all arguments from the command line and save them. + self.args = self.parser.parse_args() + + self.pakfire = Pakfire( + builder = True, + configs = [self.args.config], + disable_repos = self.args.disable_repo, + ) + + self.master = server.master.Master(self.pakfire) + + self.action2func = { + "update" : self.handle_update, + } + + def parse_command_update(self): + # Implement the "update" command. + sub_update = self.sub_commands.add_parser("update", + help=_("Update the sources.")) + sub_update.add_argument("action", action="store_const", const="update") + + def handle_update(self): + self.master.update_sources() class CliSlave(Cli): - pass + def __init__(self): + self.parser = argparse.ArgumentParser( + description = _("Pakfire slave command line interface."), + ) + + self.parse_common_arguments() + + # Add sub-commands. + self.sub_commands = self.parser.add_subparsers() + + self.parse_command_keepalive() + + # Finally parse all arguments from the command line and save them. + self.args = self.parser.parse_args() + + self.pakfire = Pakfire( + builder = True, + configs = [self.args.config], + disable_repos = self.args.disable_repo, + ) + + self.slave = server.slave.Slave(self.pakfire) + + self.action2func = { + "keepalive" : self.handle_keepalive, + } + + def parse_command_keepalive(self): + # Implement the "keepalive" command. + sub_keepalive = self.sub_commands.add_parser("keepalive", + help=_("Send a keepalive to the server.")) + sub_keepalive.add_argument("action", action="store_const", + const="keepalive") + + def handle_keepalive(self): + self.slave.keepalive() diff --git a/pakfire/config.py b/pakfire/config.py index 2a730cf8f..2bb126d59 100644 --- a/pakfire/config.py +++ b/pakfire/config.py @@ -22,6 +22,8 @@ class Config(object): self._config_repos = {} self._distro = {} + self._master = {} + self._slave = {} self._files = [] # Read default configuration files @@ -65,6 +67,18 @@ class Config(object): self._distro[k] = v config.remove_section("distro") + # Read master settings from file + if "master" in config.sections(): + for k,v in config.items("master"): + self._master[k] = v + config.remove_section("master") + + # Read slave settings from file + if "slave" in config.sections(): + for k,v in config.items("slave"): + self._slave[k] = v + config.remove_section("slave") + # Read repository definitions for section in config.sections(): if not self._config_repos.has_key(section): diff --git a/pakfire/packages/__init__.py b/pakfire/packages/__init__.py index 0983ed47a..a8717dcc3 100644 --- a/pakfire/packages/__init__.py +++ b/pakfire/packages/__init__.py @@ -9,3 +9,18 @@ from virtual import VirtualPackage from listing import PackageListing from make import Makefile from packager import BinaryPackager + +from pakfire.constants import * + +def open(pakfire, repo, filename): + """ + Function to open all packages and return the right object. + + Abstractly, this detects if a package is a source package or + not. + """ + # XXX We should make this check much better... + if filename.endswith(".src.%s" % PACKAGE_EXTENSION): + return SourcePackage(pakfire, repo, filename) + + return BinaryPackage(pakfire, repo, filename) diff --git a/pakfire/packages/base.py b/pakfire/packages/base.py index 8f926c1a0..baea8ed97 100644 --- a/pakfire/packages/base.py +++ b/pakfire/packages/base.py @@ -281,6 +281,10 @@ class Package(object): def uuid(self): return self.metadata.get("PKG_UUID", None) + @property + def supported_arches(self): + return self.metadata.get("PKG_SUPPORTED_ARCHES", "all") + @property def _provides(self): # Make package identifyable by its name and version/release tuples. diff --git a/pakfire/packages/packager.py b/pakfire/packages/packager.py index a3b1a9577..83342c5e7 100644 --- a/pakfire/packages/packager.py +++ b/pakfire/packages/packager.py @@ -15,6 +15,7 @@ import xattr import zlib import pakfire.compress +from pakfire.util import rm import util from pakfire.constants import * @@ -104,6 +105,8 @@ class Packager(object): tar.close() + rm(self.tempdir) + def create_tarball(self, compress=None): tar = InnerTarFile(self.archive_files["data.img"], mode="w") diff --git a/pakfire/repository/__init__.py b/pakfire/repository/__init__.py index a3d689948..12e3dc1bd 100644 --- a/pakfire/repository/__init__.py +++ b/pakfire/repository/__init__.py @@ -3,7 +3,7 @@ import logging from installed import InstalledRepository -from local import LocalRepository, LocalBuildRepository +from local import LocalRepository, LocalBuildRepository, LocalSourceRepository from oddments import DummyRepository, FileSystemRepository from remote import RemoteRepository diff --git a/pakfire/repository/index.py b/pakfire/repository/index.py index f18c97d95..2b2991eae 100644 --- a/pakfire/repository/index.py +++ b/pakfire/repository/index.py @@ -101,17 +101,22 @@ class DirectoryIndex(Index): file = os.path.join(dir, file) - package = packages.BinaryPackage(self.pakfire, self.repo, file) - - if package.type == "source": - # Silently skip source packages. - continue - - if not package.arch in (self.arch, "noarch"): - logging.warning("Skipped package with wrong architecture: %s (%s)" \ - % (package.filename, package.arch)) - print package.type - continue + package = packages.open(self.pakfire, self.repo, file) + + logging.debug("Found package: %s" % package) + + if isinstance(package, packages.BinaryPackage): + if not package.arch in (self.arch, "noarch"): + logging.warning("Skipped package with wrong architecture: %s (%s)" \ + % (package.filename, package.arch)) + print package.type + continue + + # XXX this is disabled because we could also have source + # repositories. But we should not mix them. + #if package.type == "source": + # # Silently skip source packages. + # continue self._packages.append(package) diff --git a/pakfire/repository/local.py b/pakfire/repository/local.py index 588e65b52..5917dcad9 100644 --- a/pakfire/repository/local.py +++ b/pakfire/repository/local.py @@ -13,7 +13,7 @@ from base import RepositoryFactory from pakfire.constants import * class LocalRepository(RepositoryFactory): - def __init__(self, pakfire, name, description, path): + def __init__(self, pakfire, name, description, path, idx="db"): RepositoryFactory.__init__(self, pakfire, name, description) # Save location of the repository and create it if not existant. @@ -21,7 +21,11 @@ class LocalRepository(RepositoryFactory): if not os.path.exists(self.path): os.makedirs(self.path) - self.index = index.LocalIndex(self.pakfire, self) + if idx == "db": + self.index = index.LocalIndex(self.pakfire, self) + + elif idx == "directory": + self.index = index.DirectoryIndex(self.pakfire, self, self.path) @property def local(self): @@ -45,7 +49,7 @@ class LocalRepository(RepositoryFactory): file = os.path.join(dir, file) - pkg = packages.BinaryPackage(self.pakfire, self, file) + pkg = packages.open(self.pakfire, self, file) self._add_package(pkg) def _add_package(self, pkg): @@ -63,7 +67,7 @@ class LocalRepository(RepositoryFactory): pkg_exists = None if os.path.exists(repo_filename): - pkg_exists = packages.BinaryPackage(self.pakfire, self, repo_filename) + pkg_exists = packages.open(self.pakfire, self, repo_filename) # If package in the repo is equivalent to the given one, we can # skip any further processing. @@ -92,7 +96,7 @@ class LocalRepository(RepositoryFactory): # Create new package object, that is connected to this repository # and so we can do stuff. - pkg = packages.BinaryPackage(self.pakfire, self, repo_filename) + pkg = packages.open(self.pakfire, self, repo_filename) logging.info("Adding package '%s' to repository." % pkg.friendly_name) self.index.add_package(pkg) @@ -104,7 +108,28 @@ class LocalRepository(RepositoryFactory): self.index.save(path) -class LocalBuildRepository(LocalRepository): +class LocalBinaryRepository(LocalRepository): + @property + def packages(self): + for pkg in self.index.packages: + # XXX should be changed to "binary" if all packages do support this. + if pkg.type == "source": + continue + + yield pkg + + +class LocalSourceRepository(LocalRepository): + @property + def packages(self): + for pkg in self.index.packages: + if not pkg.type == "source": + continue + + yield pkg + + +class LocalBuildRepository(LocalBinaryRepository): def __init__(self, pakfire): RepositoryFactory.__init__(self, pakfire, "build", "Locally built packages") diff --git a/pakfire/server/__init__.py b/pakfire/server/__init__.py new file mode 100644 index 000000000..cab1fd1cc --- /dev/null +++ b/pakfire/server/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/python + +import master +import slave + diff --git a/pakfire/server/master.py b/pakfire/server/master.py new file mode 100644 index 000000000..7481a27d0 --- /dev/null +++ b/pakfire/server/master.py @@ -0,0 +1,221 @@ +#!/usr/bin/python + +import logging +import os +import random +import shutil +import subprocess +import xmlrpclib + +import pakfire.packages as packages +import pakfire.repository as repository +import pakfire.util as util +from pakfire.constants import * + +class Source(object): + def __init__(self, master, id, name, path, targetpath, revision, branch): + self.master = master + self.id = id + self.name = name + self.path = path + self.targetpath = targetpath + self.revision = revision + self.branch = branch + + @property + def pakfire(self): + return self.master.pakfire + + def _git(self, cmd): + cmd = "cd %s; git %s" % (self.path, cmd) + + logging.debug("Running command: %s" % cmd) + + return subprocess.check_output(["/bin/sh", "-c", cmd]) + + def _git_rev_list(self, revision=None): + if not revision: + revision = self.revision + + revs = self._git("rev-list %s..origin/%s --no-merges" % (revision, self.branch)) + + return reversed(revs.splitlines()) + + def _git_changed_files(self, revision1, revision2=""): + files = self._git("diff --name-only %s %s" % (revision1, revision2)) + + return [os.path.join(self.path, f) for f in files.splitlines()] + + def _git_checkout_revision(self, revision): + self._git("checkout %s" % revision) + + def update_revision(self, revision): + self._git_checkout_revision(revision) + + # Get list of all changes files between the current revision and + # the previous one. + files = self._git_changed_files("HEAD^", "HEAD") + + self.update_files([f for f in files if f.endswith(".%s" % MAKEFILE_EXTENSION)]) + + # Send update to the server. + self.master.update_revision(self, revision) + + def update_files(self, files): + rnd = random.randint(0, 1024**2) + tmpdir = "/tmp/pakfire-source-%s" % rnd + + pkgs = [] + for file in files: + if os.path.exists(file): + pkgs.append(packages.Makefile(self.pakfire, file)) + else: + pkg_name = os.path.basename(os.path.dirname(file)) + + # Send deleted package to server. + self.master.package_remove(self, pkg_name) + + if not pkgs: + return + + # XXX This totally ignores the local configuration. + self.pakfire.dist(pkgs, destroy=False, resultdirs=[tmpdir,]) + + # Create a kind of dummy repository to link the packages against it. + repo = repository.LocalSourceRepository(self.pakfire, + "source-%s" % rnd, "Source packages", tmpdir, idx="directory") + repo.update(force=True) + + for pkg in repo.get_all(): + logging.debug("Processing package: %s" % pkg) + + pkg_path = "%(name)s/%(epoch)s-%(version)s-%(release)s/%(arch)s" % pkg.info + + file = os.path.join(self.targetpath, pkg_path, os.path.basename(pkg.filename)) + dir = os.path.dirname(file) + + print file + + if os.path.exists(file): + logging.warning("Package does already exist: %s" % file) + + else: + if not os.path.exists(dir): + os.makedirs(dir) + + # Copy the source file to the designated data pool. + shutil.copy2(pkg.filename, file) + + # Register package in database and get an ID. + pkg_id = self.master.package_add(self, pkg) + + # Re-read the package metadata (mainly update filenames). + pkg = packages.SourcePackage(self.pakfire, repo, file) + + self.master.package_file_add(self, pkg_id, pkg) + + util.rm(tmpdir) + + def update(self): + # Update files from server. + self._git("fetch") + + # If there has been no data, yet we need to import all packages + # that are currently checked out. + if not self.revision: + self.update_all() + + for rev in self._git_rev_list(): + self.update_revision(rev) + + def update_all(self): + _files = [] + for dir, subdirs, files in os.walk(self.path): + for f in files: + if not f.endswith(".%s" % MAKEFILE_EXTENSION): + continue + + _files.append(os.path.join(dir, f)) + + self.update_files(_files) + + +class Master(object): + def __init__(self, pakfire): + self.pakfire = pakfire + + server = self.pakfire.config._master.get("server") + + logging.info("Establishing RPC connection to: %s" % server) + + self.conn = xmlrpclib.Server(server) + + def update_sources(self): + sources = self.conn.sources_get_all() + + for source in sources: + source = Source(self, **source) + + source.update() + + def update_revision(self, source, revision): + self.conn.sources_update_revision(source.id, revision) + + def package_add(self, source, pkg): + logging.info("Adding package: %s" % pkg.friendly_name) + + # Collect data that is sent to the database... + info = { + "name" : pkg.name, + "epoch" : pkg.epoch, + "version" : pkg.version, + "release" : pkg.release, + "groups" : " ".join(pkg.groups), + "maintainer" : pkg.maintainer, + "license" : pkg.license, + "url" : pkg.url, + "summary" : pkg.summary, + "description" : pkg.description, + "supported_arches" : pkg.supported_arches, + "source_id" : source.id, + } + + return self.conn.package_add(info) + + def package_file_add(self, source, pkg_id, pkg): + logging.info("Adding package file: %s" % pkg.filename) + + info = { + "path" : pkg.filename[len(source.path) + 1:], + "source_id" : source.id, + "type" : pkg.type, + "arch" : pkg.arch, + "summary" : pkg.summary, + "description" : pkg.description, + "requires" : " ".join(pkg.requires), + "provides" : "", + "obsoletes" : "", + "conflicts" : "", + "url" : pkg.url, + "license" : pkg.license, + "maintainer" : pkg.maintainer, + "size" : pkg.size, + "hash1" : pkg.hash1, + "build_host" : pkg.build_host, + "build_id" : pkg.build_id, + "build_time" : pkg.build_time, + "uuid" : pkg.uuid, + } + + if isinstance(pkg, packages.BinaryPackage): + info.update({ + "provides" : " ".join(pkg.provides), + "obsoletes" : " ".join(pkg.obsoletes), + "conflicts" : " ".join(pkg.conflicts), + }) + + return self.conn.package_file_add(pkg_id, info) + + def package_remove(self, source, pkg): + logging.info("Package '%s' has been removed." % pkg) + diff --git a/pakfire/server/slave.py b/pakfire/server/slave.py new file mode 100644 index 000000000..5692f3bed --- /dev/null +++ b/pakfire/server/slave.py @@ -0,0 +1,28 @@ +#!/usr/bin/python + +import logging +import os +import socket +import xmlrpclib + +class Slave(object): + def __init__(self, pakfire): + self.pakfire = pakfire + + server = self.pakfire.config._slave.get("server") + + logging.info("Establishing RPC connection to: %s" % server) + + self.conn = xmlrpclib.Server(server) + + def keepalive(self): + """ + Send the server a keep-alive to say that we are still there. + """ + hostname = socket.gethostname() + l1, l5, l15 = os.getloadavg() + + logging.info("Sending the server a keepalive: %s" % hostname) + + self.conn.keepalive(hostname, l5) + diff --git a/pakfire/util.py b/pakfire/util.py index ced8ca01d..a4be7dfef 100644 --- a/pakfire/util.py +++ b/pakfire/util.py @@ -102,7 +102,7 @@ def do(command, shell=False, chrootPath=None, cwd=None, timeout=0, raiseExc=True preexec = ChildPreExec(personality, chrootPath, cwd) if logger: - logger.debug("Executing command: %s" % command) + logger.debug("Executing command: %s in %s" % (command, chrootPath or "/")) try: child = None diff --git a/po/pakfire.pot b/po/pakfire.pot index aca1645a5..0e163d2b8 100644 --- a/po/pakfire.pot +++ b/po/pakfire.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-10 15:19+0100\n" +"POT-Creation-Date: 2011-04-04 13:33+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,152 +17,168 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../pakfire/cli.py:27 +#: ../pakfire/cli.py:28 #, python-format msgid "%s [y/N]" msgstr "" -#: ../pakfire/cli.py:36 +#: ../pakfire/cli.py:37 msgid "Pakfire command line interface." msgstr "" -#: ../pakfire/cli.py:43 +#: ../pakfire/cli.py:44 msgid "The path where pakfire should operate in." msgstr "" -#: ../pakfire/cli.py:76 +#: ../pakfire/cli.py:77 msgid "Enable verbose output." msgstr "" -#: ../pakfire/cli.py:79 +#: ../pakfire/cli.py:80 msgid "Path to a configuration file to load." msgstr "" -#: ../pakfire/cli.py:82 +#: ../pakfire/cli.py:83 msgid "Disable a repository temporarily." msgstr "" -#: ../pakfire/cli.py:87 +#: ../pakfire/cli.py:88 msgid "Install one or more packages to the system." msgstr "" -#: ../pakfire/cli.py:89 +#: ../pakfire/cli.py:90 msgid "Give name of at least one package to install." msgstr "" -#: ../pakfire/cli.py:95 +#: ../pakfire/cli.py:96 msgid "Install one or more packages from the filesystem." msgstr "" -#: ../pakfire/cli.py:97 +#: ../pakfire/cli.py:98 msgid "Give filename of at least one package." msgstr "" -#: ../pakfire/cli.py:103 +#: ../pakfire/cli.py:104 msgid "Update the whole system or one specific package." msgstr "" -#: ../pakfire/cli.py:105 +#: ../pakfire/cli.py:106 msgid "Give a name of a package to update or leave emtpy for all." msgstr "" -#: ../pakfire/cli.py:111 +#: ../pakfire/cli.py:112 msgid "Print some information about the given package(s)." msgstr "" -#: ../pakfire/cli.py:113 +#: ../pakfire/cli.py:114 msgid "Give at least the name of one package." msgstr "" -#: ../pakfire/cli.py:119 +#: ../pakfire/cli.py:120 msgid "Search for a given pattern." msgstr "" -#: ../pakfire/cli.py:121 +#: ../pakfire/cli.py:122 msgid "A pattern to search for." msgstr "" -#: ../pakfire/cli.py:127 +#: ../pakfire/cli.py:128 msgid "Get a list of packages that provide a given file or feature." msgstr "" -#: ../pakfire/cli.py:129 +#: ../pakfire/cli.py:130 msgid "File or feature to search for." msgstr "" -#: ../pakfire/cli.py:191 +#: ../pakfire/cli.py:192 msgid "Pakfire builder command line interface." msgstr "" -#: ../pakfire/cli.py:229 +#: ../pakfire/cli.py:230 msgid "Update the package indexes." msgstr "" -#: ../pakfire/cli.py:235 +#: ../pakfire/cli.py:236 msgid "Build one or more packages." msgstr "" -#: ../pakfire/cli.py:237 +#: ../pakfire/cli.py:238 msgid "Give name of at least one package to build." msgstr "" -#: ../pakfire/cli.py:241 +#: ../pakfire/cli.py:242 msgid "Build the package for the given architecture." msgstr "" -#: ../pakfire/cli.py:243 ../pakfire/cli.py:265 +#: ../pakfire/cli.py:244 ../pakfire/cli.py:266 msgid "Path were the output files should be copied to." msgstr "" -#: ../pakfire/cli.py:248 +#: ../pakfire/cli.py:249 msgid "Go into a shell." msgstr "" -#: ../pakfire/cli.py:250 +#: ../pakfire/cli.py:251 msgid "Give name of a package." msgstr "" -#: ../pakfire/cli.py:254 +#: ../pakfire/cli.py:255 msgid "Emulated architecture in the shell." msgstr "" -#: ../pakfire/cli.py:259 +#: ../pakfire/cli.py:260 msgid "Generate a source package." msgstr "" -#: ../pakfire/cli.py:261 +#: ../pakfire/cli.py:262 msgid "Give name(s) of a package(s)." msgstr "" -#: ../pakfire/cli.py:336 -msgid "Pakfire server command line interface." +#: ../pakfire/cli.py:338 +msgid "Pakfire repo command line interface." msgstr "" -#: ../pakfire/cli.py:361 +#: ../pakfire/cli.py:363 msgid "Repository management commands." msgstr "" -#: ../pakfire/cli.py:369 +#: ../pakfire/cli.py:371 msgid "Create a new repository index." msgstr "" -#: ../pakfire/cli.py:370 +#: ../pakfire/cli.py:372 msgid "Path to the packages." msgstr "" -#: ../pakfire/cli.py:371 +#: ../pakfire/cli.py:373 msgid "Path to input packages." msgstr "" +#: ../pakfire/cli.py:385 +msgid "Pakfire master command line interface." +msgstr "" + +#: ../pakfire/cli.py:413 +msgid "Update the sources." +msgstr "" + +#: ../pakfire/cli.py:423 +msgid "Pakfire slave command line interface." +msgstr "" + +#: ../pakfire/cli.py:451 +msgid "Send a keepalive to the server." +msgstr "" + #: ../pakfire/depsolve.py:220 msgid "Package" msgstr "" -#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:72 +#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:66 msgid "Arch" msgstr "" -#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:73 +#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:67 msgid "Version" msgstr "" @@ -170,7 +186,7 @@ msgstr "" msgid "Repository" msgstr "" -#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:75 +#: ../pakfire/depsolve.py:220 ../pakfire/packages/base.py:69 msgid "Size" msgstr "" @@ -224,83 +240,87 @@ msgstr "" msgid "Total download size: %s" msgstr "" -#: ../pakfire/__init__.py:202 ../pakfire/__init__.py:233 +#: ../pakfire/__init__.py:204 ../pakfire/__init__.py:235 msgid "Is this okay?" msgstr "" -#: ../pakfire/packages/base.py:71 +#: ../pakfire/packages/base.py:65 msgid "Name" msgstr "" -#: ../pakfire/packages/base.py:74 +#: ../pakfire/packages/base.py:68 msgid "Release" msgstr "" -#: ../pakfire/packages/base.py:76 +#: ../pakfire/packages/base.py:70 msgid "Repo" msgstr "" -#: ../pakfire/packages/base.py:77 +#: ../pakfire/packages/base.py:71 msgid "Summary" msgstr "" -#: ../pakfire/packages/base.py:78 +#: ../pakfire/packages/base.py:72 +msgid "Groups" +msgstr "" + +#: ../pakfire/packages/base.py:73 msgid "URL" msgstr "" -#: ../pakfire/packages/base.py:79 +#: ../pakfire/packages/base.py:74 msgid "License" msgstr "" -#: ../pakfire/packages/base.py:82 +#: ../pakfire/packages/base.py:77 msgid "Description" msgstr "" -#: ../pakfire/packages/base.py:88 +#: ../pakfire/packages/base.py:83 msgid "UUID" msgstr "" -#: ../pakfire/packages/base.py:89 +#: ../pakfire/packages/base.py:84 msgid "Build ID" msgstr "" -#: ../pakfire/packages/base.py:90 +#: ../pakfire/packages/base.py:85 msgid "Build date" msgstr "" -#: ../pakfire/packages/base.py:91 +#: ../pakfire/packages/base.py:86 msgid "Build host" msgstr "" -#: ../pakfire/packages/base.py:93 +#: ../pakfire/packages/base.py:88 msgid "Provides" msgstr "" -#: ../pakfire/packages/base.py:98 +#: ../pakfire/packages/base.py:93 msgid "Requires" msgstr "" -#: ../pakfire/repository/index.py:300 +#: ../pakfire/repository/index.py:310 #, python-format msgid "%s: package database" msgstr "" -#: ../pakfire/transaction.py:130 +#: ../pakfire/transaction.py:133 #, python-format msgid "Cleanup: %s" msgstr "" -#: ../pakfire/transaction.py:244 +#: ../pakfire/transaction.py:247 #, python-format msgid "Installing: %s" msgstr "" -#: ../pakfire/transaction.py:249 +#: ../pakfire/transaction.py:252 #, python-format msgid "Updating: %s" msgstr "" -#: ../pakfire/transaction.py:259 +#: ../pakfire/transaction.py:262 #, python-format msgid "Removing: %s" msgstr "" diff --git a/setup.py b/setup.py index 8338427ef..808a65d63 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,13 @@ setup( author = "IPFire.org Team", author_email = "info@ipfire.org", url = "http://redmine.ipfire.org/projects/buildsystem3", - packages = ["pakfire", "pakfire.packages", "pakfire.plugins", "pakfire.repository",], + packages = [ + "pakfire", + "pakfire.packages", + "pakfire.plugins", + "pakfire.server", + "pakfire.repository", + ], scripts = [ "scripts/pakfire", "scripts/pakfire-build", -- 2.39.5